0

注意:我确实调用了这个函数并将它释放为 main 但 valgrind 仍然显示错误。这段代码基本上接受了一个带有两个数据 coeff 和 exp 的单链表。这基本上是将链表中的多项式存储转换为可读字符串。我希望动态分配它。

char *Poly_to_string(const Polynomial *p)
{
    char *x = malloc(1);
    int size;

    while (p != NULL)
    {
        if((p->exp != 0) && (p->exp != 1))
        {
            size = asprintf(&x, "%s%dx^%d + ", x, p->coeff, p->exp);
            if (size == -1)
            {
                exit(-1);
            }
        }   
        else if(p->exp == 1)
        {
            size = asprintf(&x, "%s%dx + ", x, p->coeff);
            if (size == -1)
            {
                exit(-1);
            }
        }
        else if(!p->exp)
        {
            size = asprintf(&x, "%s%d + ", x, p->coeff);
            if (size == -1)
            {
                exit(-1);
            }
        }
        p = p->next;
    }
    x[strlen(x) - 3] = '\0';
    return x;
}
4

2 回答 2

1

Linuxasprintf()手册页(我的粗体):

描述

函数asprintf()andvasprintf()是 and 的类似物 sprintf(3)vsprintf(3)除了它们分配一个足够大的字符串来保存包括终止空字节 ('\0') 的输出,并通过第一个参数返回指向它的指针。 这个指针应该被传递给 free(3) 以在不再需要时释放分配的存储空间。

返回值

成功后,这些函数返回打印的字节数,就像 sprintf(3) 一样。如果无法分配内存,或者发生其他错误,这些函数将返回 -1,并且其内容strp未定义。

这一行是错误的:

char *x = malloc(1);

它应该只是

char *x;

因为如果asprintf()有效,它将覆盖其中的内容x并导致分配的内存char *x = malloc(1);泄漏。

编辑

当您尝试增加字符串时,还需要解决循环问题:

char *Poly_to_string(const Polynomial *p)
{
    // start with an empty string that can be free()'d
    // (if you don't have strdup() use malloc() and strcpy())
    char *x = strdup("");
    int size;

    while (p != NULL)
    {
        // save the old malloc()'d value so it can be free()'d
        char *oldValue = x;

        if((p->exp != 0) && (p->exp != 1))
        {
            size = asprintf(&x, "%s%dx^%d + ", x, p->coeff, p->exp);
            if (size == -1)
            {
                exit(-1);
            }
        }   
        else if(p->exp == 1)
        {
            size = asprintf(&x, "%s%dx + ", x, p->coeff);
            if (size == -1)
            {
                exit(-1);
            }
        }
        else if(!p->exp)
        {
            size = asprintf(&x, "%s%d + ", x, p->coeff);
            if (size == -1)
            {
                exit(-1);
            }
        }

        // free() the old value
        free(oldValue);
        p = p->next;
    }
    x[strlen(x) - 3] = '\0';
    return x;
}

还有其他方法可以在没有初始的情况下执行此操作,char *x = strdup("");但代码会变得更加复杂。

于 2021-01-09T13:38:11.180 回答
0

你没有释放变量 x

于 2021-01-09T13:27:02.907 回答