【发布时间】:2020-07-20 08:49:04
【问题描述】:
我正在编写一个程序,它从文本文件中读取命令并根据它们创建一个广告。使用 valgrind 进行调试时,我收到很多错误,说我正在使用未初始化的变量。其中一个看起来像这样
Conditional jump or move depends on uninitialised value(s)
==5189== at 0x4838DD0: strcpy (vg_replace_strmem.c:512)
==5189== by 0x109A28: reduce_space (in /home/jacob/CIS2500/Ass/Ass4/a4q2)
==5189== by 0x10953A: main (in /home/jacob/CIS2500/Ass/Ass4/a4q2)
==5189== Uninitialised value was created by a heap allocation
==5189== at 0x483577F: malloc (vg_replace_malloc.c:299)
==5189== by 0x109925: reduce_space (in /home/jacob/CIS2500/Ass/Ass4/a4q2)
==5189== by 0x10953A: main (in /home/jacob/CIS2500/Ass/Ass4/a4q2)
这个错误似乎指向reduce_space函数:
char* reduce_space(char** string){
char* input = malloc(sizeof(char)*BUFFER);
char* new=malloc(sizeof(char)*BUFFER);
strcpy(input, *string);
int space = 0;
int i = 0;
int j = 0;
int count = 0;
while(input[i]!='\0'){
if(input[i]==32){
j=i+1;
if(input[j]!='\0'){
while(input[j]==32&&input[j]!='\0'){
i++;
j++;
}
}
}
new[count]=input[i];
i++;
count++;
}
new[i]='\0';
strcpy(*string, new);
free(input);
free(new);
return(*string);
}
我真的不明白未初始化的变量在哪里。我声明input 和new 错了吗?
如何调用它的示例:
#include "header.h"
int main(){
int i;
FILE* input = fopen("inputfile.input", "r");
int max = file_size(input);
char** command = malloc((sizeof(char*)) * max);
for(i=0;i<max;i++){
command[i] = malloc((sizeof(char))*BUFFER);
fgets(command[i], BUFFER, input);
}
i = 0;
while(command[i][0]!='\0'){
reduce_space(&command[i]);
i++;
}
return(0);
}
【问题讨论】:
-
inputfile.input中有什么内容?file_size()是什么?请提供一些失败的示例输入。为了制作minimal reproducible example,您可以硬编码max。 -
您是否包含
<stdio.h>和<stdlib.h>等标准标题?您的程序是否在没有警告的情况下编译?"header.h"是否相关?如果您能给我们一个完全独立的 MRE,不需要我们进行任何编辑或猜测,那将真的很有帮助。谢谢。