正确使用malloc和strcat避免valgrind的内存错误
我已将顶点存储在tempStorage中:正确使用malloc和strcat避免valgrind的内存错误,c,valgrind,C,Valgrind,我已将顶点存储在tempStorage中: typedef struct { int pred[8]; int succ[8]; } arc_set; arc_set tempStorage; 例如.pred为0,1,1,2,2,.succ为2,2,3,3,1 我做了一个char*links=malloc(sizeof(char)*100)存储这些数字并按如下方式打印: char *temp = malloc(10); for
typedef struct {
int pred[8];
int succ[8];
} arc_set;
arc_set tempStorage;
例如.pred为0,1,1,2,2,.succ为2,2,3,3,1
我做了一个char*links=malloc(sizeof(char)*100)
存储这些数字并按如下方式打印:
char *temp = malloc(10);
for (int l = 0; l < 8; l++){
sprintf(temp, "%d-%d ", tempStorage.pred[l], tempStorage.succ[l]);
strcat(links, temp);
}
free(temp);
fprintf(stdout, "Solution %d edges: %s",countLinks, links);
fprintf(stdout, "\n");
其中c:251为strcat(链路、温度)代码>和c:225是我的char*links=malloc(sizeof(char)*100)代码>
我是不是用错了strcat或者这里有什么问题 默认情况下,从malloc
获得的内存不是零初始化的。并且strcat
会将新的字符串追加到字符串的末尾。对于非零初始化的内存块,它可以位于任何位置
您不需要将整个链接设置为零——只要第一个字节就足够了。仍然memset(links,01100)代码>紧跟在malloc
之后不会受伤 使用calloc
如何?除了在开始for循环之前确保links[]
的第一个八位字节为零之外,对temp
的动态管理毫无意义<代码>字符温度[10]代码>就足够了。并认真考虑这是否是一个切实可行的解决办法。为什么是100?因为99不够,101太多了?如果cap是一个真正的未知代码,那么您的代码应该为此做好准备,而不是假设并希望是最好的。
Conditional jump or move depends on uninitialised value(s)
==12322== at 0x4C2C66A: strcat (vg_replace_strmem.c:307)
==12322== by 0x4013CC: main (program.c:251)
==12322== Uninitialised value was created by a heap allocation
==12322== at 0x4C29BC3: malloc (vg_replace_malloc.c:299)
==12322== by 0x401270: main (program.c:225)