首页 > 解决方案 > 如何使结构内的指针指向另一个指针指向的相同字符串?

问题描述

我有以下代码:

struct el{      
    char *line;
    struct el *next;
};
struct el *abc, def;
char *p1;
char buffer[100];
abc = &def;
gets(buffer);
p1 = malloc(strlen(buffer) + 1 );
strcpy( p1, buffer);

如何在不分配相同字符串两次的情况下line指出指向的相同字符串?p1写够了吗:

 abc->line = p1;

还是我还需要释放 指向的区域p1

标签: cstringpointersstruct

解决方案


我感觉到有异味...也就是说,您的所有变量似乎都是局部变量(在堆栈上),当您的函数返回时它们不再存在。

你的功能也会以

return abc;

然后你失去了一切,因为你说abc= &def;def也是一个局部变量。所以是的,你可以简单地做,abc->line= p1;但是在返回之后你丢失了abc(指向def哪个堆栈变量,然后不再存在),因此你也丢失了abc->line,所以你有内存泄漏。

因此,您应该扩展您向我们展示的代码,以便我们能够说“是的,您可以这样做”。

以下是错误函数的示例:

struct el{
    char *line;
    struct el *next;
};

struct el *example(void)
{
    struct el *abc, def;    // def is a local variable
    char *p1;
    char buffer[100];
        
    abc = &def;
    gets(buffer);
    p1 = malloc( strlen(buffer) + 1 );
    strcpy( p1, buffer);
    
    abc->line= p1;
    return abc;             // def won't exist anymore after the function returns
}

要修复此错误,您还应该执行abc= malloc(sizeof(struct el));或将指针变量传递给函数,例如:

void example2(struct el *abc)
{
    char *p1;
    // ...
    abc->line= p1;
 }

并调用例如:

int main(void)
{
    struct el pqr = {0};
    example2(&pqr);
    // ...
}

推荐阅读