首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问字符数组时状态访问溢出

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

Stack Overflow用户
提问于 2012-04-16 18:28:38
回答 3查看 55关注 0票数 0

考虑以下代码:

代码语言:javascript
运行
复制
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++;
    }
}

由于以下代码行,此代码未正常运行:

代码语言:javascript
运行
复制
tempchr=buffer[j];

这一行对于j < 10来说工作得很好,但是对于j >= 10,程序抛出了一个状态访问溢出异常。buffer变量被分配给1000个字节,因此不清楚为什么程序无法访问界限内的索引。为什么这是失败的?

有一些我没有包括的数组定义。我不认为它们是问题所在,但不管怎样,它们是:

agac阵列:

代码语言:javascript
运行
复制
    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阵列:

代码语言:javascript
运行
复制
    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
    };

霍夫曼代码数组:

代码语言:javascript
运行
复制
    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
    };  
EN

回答 3

Stack Overflow用户

发布于 2012-04-16 19:02:49

您已经注释过,文件中的所有字符都是小写字母,因此它们的代码是>= 97。但也有可能在文件的末尾有一个新的行(一些编辑器会将其放入,即使您没有新的行),这是导致错误的原因。

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

票数 2
EN

Stack Overflow用户

发布于 2012-04-16 18:54:41

添加以下代码,然后运行它:

代码语言:javascript
运行
复制
tempchr=buffer[j];
if(tmpchr < 97 || (tmpchr-97 > 26))
{
  printf("bug found");
}
strcpy(&huffmancode[0],code[tempchr-97]);
票数 0
EN

Stack Overflow用户

发布于 2012-04-16 19:02:10

这里有一个问题:

代码语言:javascript
运行
复制
fputc(length,output);

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

您可能需要:

代码语言:javascript
运行
复制
fprintf(output, "%d\n", length);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10172425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档