C中的数组访问错误

时间:2014-08-07 23:28:09

标签: c arrays error-handling char

我在代码中一直遇到valgrind错误,我不知道如何修复它。 :/ 这个想法是,无论输入中2个或更多个单词/字母之间有多少个制表符/空格,输出中它应该只有一个空格。 例如:

a    b   c d -> a b c d

代码:

char* echo(char* in) {
    char buffer[256];
    int incounter=0, buffcounter=0;

    while(incounter<(strlen(in))) {
        if(in[incounter] == ' ' || in[incounter] == '\t') incounter++;
        else if(in[incounter] != ' ' && in[incounter] != '\t') {
            while(in[incounter] != ' ' && in[incounter] != '\t') {
                buffer[buffcounter] = in[incounter];  //53
                incounter++;
                buffcounter++;              
            }           
            buffer[buffcounter] = ' ';
            buffcounter++;
        }
    }
    char* out = buffer;
    return out;
}

错误:

==20521== Conditional jump or move depends on uninitialised value(s)
==20521==    at 0x4010B4: echo (hhush.c:53)
==20521==    by 0x4021CA: readCommand (hhush.c:327)
==20521==    by 0x402538: main (hhush.c:371)
==20521==  Uninitialised value was created by a stack allocation
==20521==    at 0x402017: readCommand (hhush.c:301)
==20521== 
==20521== Conditional jump or move depends on uninitialised value(s)
==20521==    at 0x4010CE: echo (hhush.c:53)
==20521==    by 0x4021CA: readCommand (hhush.c:327)
==20521==    by 0x402538: main (hhush.c:371)
==20521==  Uninitialised value was created by a stack allocation
==20521==    at 0x402017: readCommand (hhush.c:301)

那就是我现在的地方,仍然是同样的错误

char* echo(char* in,char* buffer){
    size_t inlen=strlen(in);
    int incounter=0,buffcounter=0;
    while(incounter<inlen){
        if(in[incounter]==' '||in[incounter]=='\t')incounter++;
        else{
            while(in[incounter]!=' '&&in[incounter]!='\t'){
                buffer[buffcounter]=in[incounter];
                incounter++;
                buffcounter++;              
            }           
            buffer[buffcounter]=' ';
            buffcounter++;
        }   
    }
    return buffer;
}

我称之为:

char input[256];
fgets(input,sizeof(input),stdin);
...
char buffer[256];
printf("%s\n",echo(input,buffer));

3 个答案:

答案 0 :(得分:4)

 char* out=buffer;
 return out;
}

不要返回指向具有自动存储持续时间的数组的指针(此处为buffer数组)。如果访问指针值,则会调用未定义的行为,因为当退出声明它们的块时,将丢弃自动对象(此时echo函数返回时)。

答案 1 :(得分:0)

如果要在函数外使用缓冲区,则应将分配的缓冲区传递给函数。

void echo(char *in, char *buffer)
{
    //do stuff
}

这样您就不会尝试访问超出范围的内存。

然后您可以使用此功能

char buffer[256];
echo(string, buffer);

缓冲区现在应该包含您编辑过的字符串。

答案 2 :(得分:0)

此消息:

==20521== Conditional jump or move depends on uninitialised value(s)
==20521==    at 0x4010B4: echo (hhush.c:53)
==20521==  Uninitialised value was created by a stack allocation
==20521==    at 0x402017: readCommand (hhush.c:301)

告诉您第53行的ifwhile测试取决于未初始化的数据。有问题的数据是在第301行分配的。通过查看这些行,你应该能够知道发生了什么,但看起来你正在readCommand中在堆栈上分配一个数组,然后将它作为参数传递给echo,而不会在数组中放入任何内容。因此,您可以使用代码&#39;是实际上类似于:

char input[256];
fgets(input,sizeof(input),stdin);
...
char buffer[256];
printf("%s\n",echo(buffer));

并且您没有通过您认为自己传递的内容