gpt4 book ai didi

无法解决此c程序中的内存管理(valgrind)

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

我的问题如下。我必须创建一个 C 程序,将输入中的所有参数连接到一个缓冲区中,然后返回该缓冲区。我的解决方案有效,但存在内存管理问题。

如何解决这个问题?

#define RIALLOCA(buf, newsize) buf = realloc(buf, newsize);

char *mystrcat(char *buf, size_t sz, char *first, ...) {
va_list l;
va_start(l, first);

buf = malloc(strlen(buf) + 1);

if (sz < strlen(first) + 1) {
sz += (strlen(first) + 1);
}

RIALLOCA(buf, sz + 1 + 16);
strncat(buf, first, strlen(first));

char *nextString = va_arg(l, char *);

while (nextString != NULL) {
// sz += strlen(nextString);
RIALLOCA(buf, strlen(buf) + strlen(nextString) + 1 + 16);
strncat(buf, nextString, strlen(nextString));
nextString = va_arg(l, char *);
}

va_end(l);

return buf;
}

int main(int argc, char *argv[]) {
if (argc != 7) {
printf("troppi pochi argomenti\n");
return -1;
}
char *buffer = NULL;
RIALLOCA(buffer, 16); // macro che effettua l'allocazione
buffer[0] = '\0';
buffer = mystrcat(buffer, 16, argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], NULL);
printf("%s\n", buffer);
free(buffer);
return 0;
}

这是 Valgrind 的问题

enter image description here

最佳答案

问题是 - 当您在 mystrcat() 内调用 buf = malloc() 时 - 您会导致内存泄漏。内存已在 main() 中为 buf 动态分配。

改变

buf = malloc(strlen(buf)+1);

buf = realloc(buf, strlen(buf) + 1);

另外...我同意 user3629249 的观点:以您所做的方式为标准库函数提供宏似乎是多余的 - 至少在这种情况下。

关于无法解决此c程序中的内存管理(valgrind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56515194/

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