代码如下:
/* set.h */
struct setElement{
char *element;
setElement *next;
};
typedef struct setElement *Set; //Set is now the equivalent of setElement*
Set a;
setInit(&a);
/* setInit function declaration @ setInit.c */
int setInit(Set *a){
(*a)->element = "asdf"; //results in a seg fault
}
尝试malloc'a'有效,但如果我尝试访问集合中的任何成员'a'不起作用。我理解我将set()的引用从main()函数传递给setInit,所以我相信setInit中包含的指针正在寻址main()函数中'Set a'分配的内存,所以malloc会不会'是必需的......
Iunno。感谢帮助:)
答案 0 :(得分:4)
问题是您尚未分配您要分配的setElement
。在代码的主要部分中,您创建了一个Set
,它只是指向setElement
的指针。永远不会将此指针设置为指向任何合理的指针。即你需要像
Set a = malloc(sizeof(setElement));
答案 1 :(得分:1)
唉,目前还不清楚你的变量究竟在哪里定义。我假设您的main.c
类似于
#include "set.h"
Set a;
int main()
{
setInit(&a);
}
如果是这样,你的a,它本身就是一个指针,应该指向某个地方。
如果您的框架需要malloc()
ed数据,则应该
int main()
{
a = malloc(sizeof(*a)); // *a is a struct setElement now, with 2 pointer-sized members.
setInit(&a); // Now seInit should be able to operate on the struct as wanted.
}
答案 2 :(得分:0)
正如@amaurea所提到的,你需要为你的setElement结构使用malloc()。除此之外,您还需要为setElement struct的element
成员执行相同的操作。 char*
只是指向char或char数组的指针,不会隐式分配任何内容。
int setInit(Set *a){
(*a)->element = "asdf"; //results in a seg fault
}
可以重写
int setInit(Set *a){
(*a)->element = malloc(sizeof("asdf"));
strcpy((*a)->element,"asdf");
}
可以重写上述内容以获取实际element
内容的第二个参数。