作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据 Valgrind 的说法,变量“holder”在我的函数 spaceMove() 中未初始化。值得注意的是,每当我尝试操纵该变量时,它都会说。我也尝试在进入循环之前将其初始化为 NULL,但它仍然给我相同的消息。如果有人能解释为什么持有者被视为未初始化,我们将不胜感激,谢谢。
void spaceMove(char *str, char *delim){
int i, spPlus=0;
char *holder;
holder = malloc(strlen(str)+1);
for(i=0; i<strlen(str); i++, spPlus++){
if(str[i] == ' ' && str[i+1] == ' '){
strcat(holder, " "); //line 11
//spPlus += 1;
i += 1;
}
else if(str[i] == '\t' && str[i+1] == '\t'){
strcat(holder, "\t"); //line 16
i += 1;
}
holder[spPlus] = str[i];
}
strcpy(str, holder); //line 21
}
void processStrings(struct mainList *header){
int i;
struct stringList *temp;
temp = header->next;
while(temp != NULL){
for(i=0; i<strlen(temp->string); i++){
if(temp->string[i] == ' ' || temp->string[i] == '\t'){
spaceMove(temp->string, " "); //line 101
}
}
temp = temp->next;
}
}
这是 Valgrind 消息:
==3102== Conditional jump or move depends on uninitialised value(s)
==3102== at 0x4C2F0A8: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3102== by 0x400B38: spaceMove (listHelper.c:21)
==3102== by 0x4010CF: Strings (listio.c:101)
==3102== by 0x4009A4: main (tempMain.c:27)
==3102==
==3102== Conditional jump or move depends on uninitialised value(s)
==3102== at 0x400A69: spaceMove (listHelper.c:11)
==3102== by 0x4010CF: Strings (listio.c:101)
==3102== by 0x4009A4: main (tempMain.c:27)
==3102==
==3102== Conditional jump or move depends on uninitialised value(s)
==3102== at 0x400AC8: spaceMove (listHelper.c:16)
==3102== by 0x4010CF: Strings (listio.c:101)
==3102== by 0x4009A4: main (tempMain.c:27)
最佳答案
您不能将 strcat
与非 '\0'
终止的字符串一起使用
holder = malloc(strlen(str)+1);
holder[0] = '\0'; /* Add this line */
或者使用calloc
代替malloc
关于即使我的变量已初始化,条件跳转或移动仍取决于未初始化的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39659160/
我是一名优秀的程序员,十分优秀!