首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法解决此c程序中的内存管理(valgrind)问题

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

Stack Overflow用户
提问于 2019-06-09 21:56:29
回答 2查看 59关注 0票数 0

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

我如何解决这个问题?

代码语言:javascript
复制
#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的问题

EN

回答 2

Stack Overflow用户

发布于 2019-06-09 22:45:10

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

变化

代码语言:javascript
复制
buf = malloc(strlen(buf)+1);

代码语言:javascript
复制
buf = realloc(buf, strlen(buf) + 1);

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

票数 0
EN

Stack Overflow用户

发布于 2019-06-09 22:45:45

在函数中:mystrcat()

这句话:

代码语言:javascript
复制
buf = malloc(strlen(buf) + 1);

是不正确的。因为buf已经是一个指向已分配内存的指针,这并不是在修改main()函数中的指针buf,而只是修改堆栈上的参数。

要更正,请执行以下操作:

main()中(注意参数:buffer上的附加'&‘)

代码语言:javascript
复制
buffer = mystrcat(&buffer, 16, argv[1], argv[2], argv[3], argv[4], 
argv[5], argv[6], NULL);

mystrcat()中删除此行

代码语言:javascript
复制
buf = malloc(strlen(buf) + 1);

关于:

代码语言:javascript
复制
if(sz < strlen(first) + 1)
{
    sz += (strlen(first) + 1);
}

由于sz包含16,而buf中的第一个字符是'\0‘,因此永远不会输入此if()语句。

由于传递的参数buf现在是指向指针的指针,因此由于main()中的更改,签名应为:

代码语言:javascript
复制
char* mystrcat(char **buf, size_t sz, char *first, ...) 

并且所有对buf的引用都应该取消对该参数的引用,以访问main()中的指针值

还有更多,但以上是潜在的问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56515194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档