今天在刷題的時候遇到裡乙個bug,試了很多辦法都沒有解決,最後用malloc開闢動態記憶體解決了這個問題,期間遇到了各種bug,最後來總結一下我解決問題的過程。
先把題目擺在這裡
若有非零整數a、b、c,將其組成兩個等式(a@b)#c = 24、a@(b#c) = 24,其中@和#為運算符號』+』、』-』、』*』、』/』、』%'之一,如何輸入n行3列的資料呢?同一符號可選擇一次或多次,如果這兩個等式至少有乙個成立,則輸出yes,否則輸出no。
輸入:第一行輸入正整數n,表示有n組資料。(n<1000)
其後n行每行輸入非零整數a、b、c(-1e5 <= a、b、c <= 1e5)
輸出:如果兩個等式至少有乙個成立,則輸出yes,否則輸出no,每組資料的輸出佔一行。
樣例輸入 :
34 1 6
3 4 5
6 3 12
樣例輸出 :
yes no yes
(注意,在該題中整數 / 整數,取結果的整數部分,例如1 / 4 = 0)
我先是這樣寫的**
int n=0;
scanf
("%d"
,&n)
;int arr[
3]=;
for(
int i =
0; i <
3; i++
)
這樣我一執行傻了,我照題目的用例輸入資料,輸完3行後程式還在繼續,我輸了5行程式才停止,於是我除錯了一下,發現
?????,為啥我的n值改變了,變成了我最後輸入的乙個資料5,所以迴圈一直執行下去了,直到我輸入了5行。
隨後我想到可能是n所在記憶體被5覆蓋掉了,於是我又去記憶體中找找原因,果然!!!
看!我這裡的n本來是3,直到我輸完了第二行,n值所在的記憶體被5也就是arr[1][2]所覆蓋掉了。於是我意識到了,這個二維陣列在我沒有定義行的時候,它預設只開闢了一行資料空間,也就是3個int型別空間的大小,這裡我畫個圖就清楚了。
既然變數n和開闢的二維陣列離的這麼近,我何不讓兩個變數不在一塊記憶體中,於是我就想到了把n作為全域性變數寫在程式中,因為全域性變數開闢是在記憶體中的全域性儲存區,而區域性變數的開闢是在記憶體中的棧上。這樣不在一塊開闢,何談覆蓋不覆蓋而言!!!
於是我就這樣幹的,執行程式,竟然又是乙個錯誤**,我這個思路沒有錯啊,怎麼回事。
我的天,這是什麼,
run-time check failure#2 - stack around the variable 「arr」 wascorrupted.
翻譯過來是:執行時檢查失敗#2-變數「arr」周圍的堆疊已損壞。
網上查了一下,這次的問題是二維陣列開闢的問題
預設只開了3個(int)型的空間,好傢伙,我直接輸了9個,直接越界,這個問題有時候會報錯有時候不會,按理來說,哨兵位就是保護棧的讓變數的記憶體之間,貿然給哨兵位賦值或者一直訪問沒有開闢的記憶體,就有可能出現這個報錯!!!
沒得辦法,我只好老老實實在堆開闢一塊動態記憶體,用來存放我的二維陣列。
用malloc語句
因為是二維陣列,我只好開闢1000個(int*)的記憶體作為行(題目說不能不能超過1000行)
arr = (int**)malloc(1000 * sizeof(int*));然後for迴圈每個行,在每行中開闢3個(int)的空間作為列
for (int i = 0; i < 3; i++)這樣就完美開闢出了一塊記憶體空間存放我的n行3列陣列。
(注):不要忘了free掉空間和把指標置為null呦!!!
之後的演算法很簡單,我把原始碼粘在部落格上供小夥伴們參考
#define _crt_secure_no_warnings 1
#include
#include
//若有非零整數a、b、c,將其組成兩個等式(a@b)#c = 24、a@(b#c) = 24,其中@和#為運算符號'+'、'-'、"*、'/'、'%'之一,
//同一符號可選擇一次或多次,如果這兩個等式至少有乙個成立,則輸出yes,否則輸出no。
//輸入:
//第一行輸入正整數n,表示有n組資料。(n<1000)
//其後n行每行輸入非零整數a、b、c(-1e5 <= a、b、c <= 1e5)
//輸出 :
//如果兩個等式至少有乙個成立,則輸出yes,否則輸出no,每組資料的輸出佔一行。
//樣例輸入 :
//3//4 1 6
//3 4 5
//6 3 12
//樣例輸出 :
//yes
//no
//yes
//(注意,在該題中整數 / 整數,取結果的整數部分,例如1 / 4 = 0)
intoperation
(int a,
int b,
int input)
return0;
}int
main()
for(
int i =
0; i < n; i++
)int num1 =0;
int num2 =0;
int input1 =0;
for(
int i =
0; i < n; i++)}
if(num1 ==
24|| num2 ==24)
}if(input1 ==6)
}free
(arr)
; arr =
null
;return0;
}
Get 二維陣列的維數 行和列
平時我不太常用二維陣列,所以比較陌生,為熟悉和了解二維陣列整理此文。1 二維陣列的宣告與初始化 int arrayint2 定義乙個二維陣列 arrayint2 newint 3 5 初始化 2 遍歷二維陣列 最常用的遍歷陣列的方式是使用foreach,foreach語句可以訪問陣列中的每個元素,而...
二維陣列的輸入
不像二維陣列那樣,可以直接對arr i j 進行迴圈賦值。在vector 中,因為vector是乙個容器,最外層的vector容器中放著更小的vector,而里層的vector裡面放的是int型的數字。所以我們首先要對裡層的vector容器賦值,然後再把裡層的vector作為元素插入到外層的vect...
C 動態開闢二維陣列及memset 的應用
在c 中要動態地開闢陣列,需要使用new,那麼如果要開闢m行n列的二維陣列呢?需要我們首先開闢乙個長度為m的指標陣列,然後對於每個指標開闢乙個長度為n的陣列 int a new int m for int i 0 i m i 如果這時我想讓陣列的每個值都為0呢?如何使用memset 如果只想通過一次...