1

代码如下:

/* 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' 中的任何成员都不起作用。我知道我正在将 main() 函数中的集合的引用传递给 setInit,所以我相信 setInit 中包含的指针正在寻址 main() 函数中的“Set a”分配的内存,所以 malloc 不会不需要...

恩诺。帮助表示赞赏:)

4

3 回答 3

4

问题是你没有分配setElement你试图分配的。在代码的主要部分中,您正在创建一个Set,它只是一个指向 a 的指针setElement。这个指针永远不会被设置为指向任何有意义的东西。即你需要类似的东西

Set a = malloc(sizeof(setElement));
于 2012-10-30T18:59:53.090 回答
1

las,尚不清楚您的变量的确切定义位置。我想你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.
}
于 2012-10-30T18:59:31.447 回答
0

正如@amaurea 所提到的,您需要将 malloc() 用于您的 setElement 结构。除此之外,您需要对 setElement 结构的element成员执行相同的操作。Achar*只是一个指向 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内容的第二个参数。

于 2012-10-30T21:23:22.333 回答