我有一个包含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;
答案 0 :(得分:0)
char buf[128]
是在assign函数的上下文中堆栈分配的。它不能以这种方式传递下来,因为函数返回后内存就消失了。您需要使用char *buf;
,然后执行buf = malloc(128);
。
答案 1 :(得分:0)
在Assign函数中使用的Buf字符串是assign函数的本地变量。这意味着退出分配功能的范围后,将无法访问该内存(它将成为垃圾)。
要解决此问题,您可以使用2种方法:
在数据段中创建buf字符串(即,将其创建为静态/全局可变)或在堆中创建buf字符串(使用malloc)。
使用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;
}