gpt4 book ai didi

正确使用 malloc 和 strcat 以避免 valgrind 内存错误

转载 作者:行者123 更新时间:2023-11-30 14:38:32 25 4
gpt4 key购买 nike

我已将顶点存储在我的 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 (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");

使用sprintf在temp中以“%d-%d”格式存储字符串然后用 strcat将其与链接连接起来。

它确实正确打印了所有内容,但是当我用 valgrind --leak-check=full --track-origins=yes -v ./programname 测试它时我确实明白:

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)

其中 c:251 是 strcat(links, temp); c:225 是我的 char *links = malloc(sizeof(char) * 100);

我使用 strcat 是错误的还是这里有什么问题?

最佳答案

默认情况下,从 malloc 获得的内存不是零初始化的。 strcat 会将新值附加到字符串的末尾。对于可能位于任何地方的非零初始化内存块。

您不需要将整个链接设置为零——只需第一个字节就足够了。在 malloc 之后仍然使用 memset(links, 0, 100); 不会有什么坏处。

关于正确使用 malloc 和 strcat 以避免 valgrind 内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56518168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com