2012-04-16 18 views
0

考慮下面的代碼:狀態接入溢出,同時訪問字符數組

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 
    }; 
+0

爲什麼手動計數長度? 'fgets'正確終止讀取字符串,所以你可以使用'strlen'。 – 2012-04-16 10:32:22

+0

我只是想把第一個想法變成鍵盤。你知道,與最後期限戰鬥。 – cngkaygusuz 2012-04-16 10:33:37

+0

你是否在編譯時禁用了所有優化?當試圖將機器代碼指令與源代碼行匹配時,優化有一種混淆調試器的趨勢。 – 2012-04-16 10:34:52

回答

0

添加此代碼然後運行它:

tempchr=buffer[j]; 
if(tmpchr < 97 || (tmpchr-97 > 26)) 
{ 
    printf("bug found"); 
} 
strcpy(&huffmancode[0],code[tempchr-97]); 
0

這裏有一個問題:

fputc(length,output); 

這隻會寫的length最低(最低顯著)字節(這是一個int)輸出文件。它會以二進制形式寫入,這對於以.txt擴展名打開的文件來說似乎很奇怪。

你可能想:

fprintf(output, "%d\n", length); 
2

您已經評論說,文件中的所有字符都只是小書,以便他們的代碼> = 97,但它有可能存在於年底新線該文件(即使你沒有新的一行,一些編輯也會這樣做),這會導致錯誤。

請注意,與gets不同,fgets在緩衝區中包含換行符(請參見fgets)。