在函数中分配结构的char **成员

时间:2019-05-14 10:13:41

标签: c

我有一个包含char **的结构,我需要在一个函数中分配其成员,但以下分配无效:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
    char **clist;
} rule;

void assign(rule *rule) {
    char buf[128] = "hello";
    rule->clist[0] = buf;
}

int main()
{
    rule rule;
    rule.clist = malloc(sizeof(char*) * 8);

    assign(&rule);
    printf("%s\n", rule.clist[0]);

    return 0;
}

尽管可以在主功能中进行如下分配:

char buf[] = "hello";
rule.clist[0] = buf;

2 个答案:

答案 0 :(得分:0)

char buf[128]是在assign函数的上下文中堆栈分配的。它不能以这种方式传递下来,因为函数返回后内存就消失了。您需要使用char *buf;,然后执行buf = malloc(128);

答案 1 :(得分:0)

在Assign函数中使用的Buf字符串是assign函数的本地变量。这意味着退出分配功能的范围后,将无法访问该内存(它将成为垃圾)。

要解决此问题,您可以使用2种方法:

  1. 在数据段中创建buf字符串(即,将其创建为静态/全局可变)或在堆中创建buf字符串(使用malloc)。

  2. 使用strcpy将buf中的数据复制到rule.clist[0]中。

这应该有效:

void assign(rule *rule) {
    char buf[128] = "hello";
    rule->clist[0] = (char*)malloc(sizeof(char)*(strlen(buf)+1));
    strcpy(clist[0],buf);
}

int main()
{
    rule rule;
    rule.clist = malloc(sizeof(char*) * 8);

    assign(&rule);
    printf("%s\n", rule.clist[0]);

    return 0;
}