作者hardman1110 (硬汉)
看板C_and_CPP
标题[问题] 阵列大小宣告
时间Mon May 11 22:44:50 2009
#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
1F:→ sosokill:Char是8byte? 05/11 22:57
2F:→ i1537:一维阵列 不是 存取的长度 05/11 23:02
3F:→ sosokill:fscanf这个函数去查看看 我没用过 感觉是这里造成的 05/11 23:10
4F:推 VictorTom:虽然你只宣告char [5], 但是考虑记忆体对齐等情况, 有时 05/11 23:22
5F:→ VictorTom:後的确会有这种超用了没出事的case, 但基本上这样的程式 05/11 23:23
6F:→ VictorTom:都是unstable的, 尤其也许debug版OK, release马上挂给你 05/11 23:23
7F:→ VictorTom:看, 或反过来; 最主要的原因是, 你区域变数范围超用, 就 05/11 23:23
8F:→ VictorTom:会复写到stack里的data, 到时候程式关闭时发生错误或者 05/11 23:24
9F:→ VictorTom:call function回不去你就知道了:) 另外, 这种情况下执行 05/11 23:25
10F:→ VictorTom:到该行会印出全部, 是因为char string是以\0当作结束的 05/11 23:26
11F:→ VictorTom:条件, 所以印那麽长的理由不在[]大小, 而在'\0'的位置. 05/11 23:27
12F:→ VictorTom:当然你要是写/读的更长踩到了当场就会烂的地方就先当了. 05/11 23:27