我的问题如下。我必须创建一个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的问题
发布于 2019-06-09 22:45:10
问题是,当您在mystrcat()
中调用buf = malloc()
时,您将导致内存泄漏。已经在main()
中为buf
动态分配了内存。
变化
buf = malloc(strlen(buf)+1);
至
buf = realloc(buf, strlen(buf) + 1);
还有..。我同意user3629249的观点:以这种方式为标准库函数提供宏似乎是多余的--至少在这种情况下是多余的。
发布于 2019-06-09 22:45:45
在函数中:mystrcat()
这句话:
buf = malloc(strlen(buf) + 1);
是不正确的。因为buf
已经是一个指向已分配内存的指针,这并不是在修改main()
函数中的指针buf
,而只是修改堆栈上的参数。
要更正,请执行以下操作:
在main()
中(注意参数:buffer
上的附加'&‘)
buffer = mystrcat(&buffer, 16, argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], NULL);
在mystrcat()
中删除此行
buf = malloc(strlen(buf) + 1);
关于:
if(sz < strlen(first) + 1)
{
sz += (strlen(first) + 1);
}
由于sz
包含16,而buf
中的第一个字符是'\0‘,因此永远不会输入此if()
语句。
由于传递的参数buf
现在是指向指针的指针,因此由于main()
中的更改,签名应为:
char* mystrcat(char **buf, size_t sz, char *first, ...)
并且所有对buf
的引用都应该取消对该参数的引用,以访问main()
中的指针值
还有更多,但以上是潜在的问题
https://stackoverflow.com/questions/56515194
复制相似问题