访问字符数组时状态访问溢出

时间:2012-04-16 10:28:38

标签: c

请考虑以下代码:

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

3 个答案:

答案 0 :(得分:2)

您评论说文件中的所有字符都只是小写字母,所以它们的代码是&gt; = 97.但是文件末尾可能有一个新行(即使您有一些编辑也会这样做没有新线路,导致了这个错误。

请注意,与gets不同,fgets包含缓冲区中的换行符(请参阅fgets)。

答案 1 :(得分:0)

添加此代码然后运行它:

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

答案 2 :(得分:0)

这是一个问题:

fputc(length,output);

这只会将length的最低(最低有效)字节(即int)写入输出文件。它将以二进制形式编写,对于使用.txt扩展名打开的文件来说,这似乎很奇怪。

你可能想要:

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