在函数中指定结构的char**成员
我有一个包含char**的结构,我需要在函数中分配其成员,但以下分配不起作用:在函数中指定结构的char**成员,c,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; } in
#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[128]
是在赋值函数的上下文中分配的堆栈。它不能以这种方式传递,因为在函数返回后,内存就消失了。您需要使用char*buf代码>然后执行buf=malloc(128)代码>取而代之 char buf[128]
是在赋值函数的上下文中分配的堆栈。它不能以这种方式传递,因为在函数返回后,内存就消失了。您需要使用char*buf代码>然后执行buf=malloc(128)代码>取而代之 在赋值函数中使用的Buf字符串是赋值函数的局部变量。这意味着退出赋值函数的作用域后,您将无法访问此内存(它将成为垃圾)
要修复它,可以使用两种方法:
在数据段(即创建为静态/全局变量)或堆(使用malloc)中创建buf字符串
使用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;
}
在赋值函数中使用的Buf字符串是赋值函数的局部变量。这意味着退出赋值函数的作用域后,您将无法访问此内存(它将成为垃圾)
要修复它,可以使用两种方法:
在数据段(即创建为静态/全局变量)或堆(使用malloc)中创建buf字符串
使用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;
}
在assign
函数中,变量buf
是一个局部变量,其生存期将随着函数的结束而结束,给您留下一个无效指针。关于堆栈溢出,这里有很多重复的内容。请阅读C语言书中关于C字符串的章节。这将是早期的。也不要使用诸如“它工作”和“它不工作”之类的问题描述;如果buf
在主程序中被声明为一个变量,那么如果您想在assign
中使用该变量,需要做什么呢?请您自己帮个忙,在C编译器中启用所有警告(如果可能,甚至使其出错)。例如,如果您使用的是gcc,请将-Wall-Werror
添加到assign
函数中的编译器命令行中,变量buf
是一个局部变量,其生存期将随着函数的结束而结束,留下一个无效指针。关于堆栈溢出,这里有很多重复的内容。请阅读C语言书中关于C字符串的章节。这将是早期的。也不要使用诸如“它工作”和“它不工作”之类的问题描述;如果buf
在主程序中被声明为一个变量,那么如果您想在assign
中使用该变量,需要做什么呢?请您自己帮个忙,在C编译器中启用所有警告(如果可能,甚至使其出错)。例如,如果您使用的是gcc,那么将-Wall-Werror
添加到编译器命令行规则->clist[0]=(char*)malloc(sizeof(char)*(strlen(buf)+1));strcpy(clist[0],buf)代码>应该是规则->clist[0]=strdup(buf)代码>它给出了相同的结果,所以是的,你是对的规则->clist[0]=(char*)malloc(sizeof(char)*(strlen(buf)+1));strcpy(clist[0],buf)代码>应该是规则->clist[0]=strdup(buf)代码>它给出相同的结果,所以是的,你是对的