考慮下面的代碼:狀態接入溢出,同時訪問字符數組
FILE *input;
FILE *output;
input=fopen("in.txt", "r");
output=fopen("out.txt", "w");
char buffer[1000];
char bytebuffer=0;
char tempchr=0;
char huffmancode[100]={0};
int bufferindex=7;
fgets(&buffer[0],255,input);
int length=0;
while (buffer[length]!=0) length++;
fputc(length,output);
int j;
int k;
for (j=0;j<length;j++){
tempchr=buffer[j];
strcpy(&huffmancode[0],code[tempchr-97]);
k=0;
while(huffmancode[k]!=0){
if (huffmancode[k]!='0'){
setBit(&bytebuffer,bufferindex);
}
bufferindex-=1;
if (bufferindex==-1){
fputc(bytebuffer,output);
bytebuffer=0;
bufferindex=7;
}
k++;
}
}
此代碼運行不正常,因爲這條線:
tempchr=buffer[j];
這條線適用於j < 10
但完全正常對於j >= 10
程序會引發狀態訪問溢出異常。緩衝區變量分配爲1000字節,所以不清楚爲什麼程序無法訪問邊界中的索引。爲什麼這是失敗的?
有一些我沒有包括的數組定義。我不認爲他們是問題,但在這裏,他們是反正:
的agac
陣列:
int agac[1000]={21,12,9,7,5,
5,4,0,0,0,
0,3,2,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0
};
的sembol
陣列:
char sembol[1000]={0,0,0,'a','b',
0,'f',0,0,0,
0,'u','k',0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0
};
的霍夫曼碼陣列:
char *code[27]={ "00","01",0,0,0,
"11",0,0,0,0,
"101",0,0,0,0,
0,0,0,0,"100",
0,0,0,0,0,
0,0
};
爲什麼手動計數長度? 'fgets'正確終止讀取字符串,所以你可以使用'strlen'。 – 2012-04-16 10:32:22
我只是想把第一個想法變成鍵盤。你知道,與最後期限戰鬥。 – cngkaygusuz 2012-04-16 10:33:37
你是否在編譯時禁用了所有優化?當試圖將機器代碼指令與源代碼行匹配時,優化有一種混淆調試器的趨勢。 – 2012-04-16 10:34:52