C 開闢輸入n行3列二維陣列的bug

2021-10-11 02:25:13 字數 3128 閱讀 1655

今天在刷題的時候遇到裡乙個bug,試了很多辦法都沒有解決,最後用malloc開闢動態記憶體解決了這個問題,期間遇到了各種bug,最後來總結一下我解決問題的過程。

先把題目擺在這裡

若有非零整數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,每組資料的輸出佔一行。

樣例輸入 :

34 1 6

3 4 5

6 3 12

樣例輸出 :

yes no yes

(注意,在該題中整數 / 整數,取結果的整數部分,例如1 / 4 = 0)

如何輸入n行3列的資料呢?

我先是這樣寫的**

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 如果只想通過一次...