[問題] 陣列大小宣告

看板C_and_CPP (C/C++)作者 (硬漢)時間16年前 (2009/05/11 22:44), 編輯推噓1(1011)
留言12則, 3人參與, 最新討論串1/1
#include <stdio.h> #include <stdlib.h> #include <iostream.h> #include <conio.h> void main(void) { FILE *fp_2; int i,j,bit,num,out=0,match; char file_name_2[20]=""; char h_1[5]; printf("file name_2:");//霍夫曼表 scanf("%s",file_name_2); if((fp_2=fopen(file_name_2,"r"))==NULL) { printf("test file name error!!\n"); exit(1); } fscanf(fp_2,"%s",&h_1); cout<<h_1; fclose(fp_2); } 我故意只將陣列大小給5,但是掃入11001111111110,為何我在輸出時還是可以完整輸出 照理說大小只有5只能存11001不是嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.42.200.81

05/11 22:57, , 1F
Char是8byte?
05/11 22:57, 1F

05/11 23:02, , 2F
一維陣列 不是 存取的長度
05/11 23:02, 2F

05/11 23:10, , 3F
fscanf這個函數去查看看 我沒用過 感覺是這裡造成的
05/11 23:10, 3F

05/11 23:22, , 4F
雖然你只宣告char [5], 但是考慮記憶體對齊等情況, 有時
05/11 23:22, 4F

05/11 23:23, , 5F
後的確會有這種超用了沒出事的case, 但基本上這樣的程式
05/11 23:23, 5F

05/11 23:23, , 6F
都是unstable的, 尤其也許debug版OK, release馬上掛給你
05/11 23:23, 6F

05/11 23:23, , 7F
看, 或反過來; 最主要的原因是, 你區域變數範圍超用, 就
05/11 23:23, 7F

05/11 23:24, , 8F
會複寫到stack裡的data, 到時候程式關閉時發生錯誤或者
05/11 23:24, 8F

05/11 23:25, , 9F
call function回不去你就知道了:) 另外, 這種情況下執行
05/11 23:25, 9F

05/11 23:26, , 10F
到該行會印出全部, 是因為char string是以\0當作結束的
05/11 23:26, 10F

05/11 23:27, , 11F
條件, 所以印那麼長的理由不在[]大小, 而在'\0'的位置.
05/11 23:27, 11F

05/11 23:27, , 12F
當然你要是寫/讀的更長踩到了當場就會爛的地方就先當了.
05/11 23:27, 12F
文章代碼(AID): #1A23dZ8i (C_and_CPP)
文章代碼(AID): #1A23dZ8i (C_and_CPP)