我在代码中一直遇到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));
答案 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行的if
或while
测试取决于未初始化的数据。有问题的数据是在第301行分配的。通过查看这些行,你应该能够知道发生了什么,但看起来你正在readCommand
中在堆栈上分配一个数组,然后将它作为参数传递给echo
,而不会在数组中放入任何内容。因此,您可以使用代码&#39;是实际上类似于:
char input[256];
fgets(input,sizeof(input),stdin);
...
char buffer[256];
printf("%s\n",echo(buffer));
并且您没有通过您认为自己传递的内容