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
}

「a」を malloc しようとすると機能しますが、セット「a」内のメンバーにアクセスしようとすると機能しません。main() 関数から setInit にセットの参照を渡していることを理解しているので、setInit に含まれるポインターは、main() 関数の「Set a」によって割り当てられたメモリをアドレス指定しているため、malloc は「必須ではありません...

いんの。助けていただければ幸いです:)

4

3 に答える 3

4

問題は、setElement割り当てようとしている を割り当てていないことです。コードの主要部分では、 を作成していますがSet、これは単なる へのポインタsetElementです。このポインターは、適切なものを指すように設定されることはありません。つまり、次のようなものが必要です

Set a = malloc(sizeof(setElement));
于 2012-10-30T18:59:53.090 に答える
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.
}
于 2012-10-30T18:59:31.447 に答える
0

@amaurea が述べたように、 setElement 構造に malloc() を使用する必要があります。これに加えて、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内容の 2 番目のパラメーターを取るように書き換えることができます。

于 2012-10-30T21:23:22.333 に答える