我的问题如下。我必须创建一个 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 的问题
最佳答案
问题是 - 当您在 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/