[英]Why output of this C program is not correct
我已經編寫了這樣的交流程序,希望能獲得正確的輸出。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int t;
scanf("%d", &t);
int a[t-1], b[t-1];
//printf("%d\n",sizeof(a) );
do{
scanf("%d %d", &a[t-1], &b[t-1]);
}while(--t);
do{
printf("%d\n",a[t-1] + b[t-1]);
}while(--t);
return 0;
}
但是我得到的是隨機值,這個程序怎么了? 嘗試輸入嘗試次數,然后輸入值,然后打印這些值的加法。
PS數組初始化在這里是動態的,是否有效?
聲明長度為10
的數組時,索引為0
到9
。 該數組沒有索引10
。
在您的代碼中,數組的大小為t-1
int a[t-1], b[t-1];
因此,在您的第一次迭代中, scanf()
和printf()
語句訪問a[t-1]
,該參數不存在。 而且,由於它是一個do while
循環,因此可以保證至少運行一次。
訪問數組超出其邊界是未定義的行為 。 因此,正如Cool Guy在評論中指出的那樣,任何事情都可能發生。
在讀取所有值和打印所有值之間,您永遠不會將t
重置為其原始值。 您可能需要執行此操作,可能使用另一個變量來保存其原始值。
數組大小應為常數,不能在運行時設置。 對於運行時內存分配,您需要將指針變量與malloc函數一起使用。 因此,首先您需要在聲明時為變量t分配一個常量值。
提示,請務必在任何語句之前聲明和初始化變量。 數組初始化應該在scanf之前進行,通過這樣做,您可以清楚地看到問題,即您正在分配內存(隨機地),然后從用戶那里獲得價值。 編譯器必須做類似的事情,分配一些隨機大小的內存,然后獲取值t,現在此值t將僅在您的迭代中使用,而不用於數組分配,因為數組之前以一定的rand大小分配(無論有什么垃圾t在聲明時指向的值)。 該程序有時會顯示一些隨機值,有時會在訪問超出范圍的內存時崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.