2

私はCが初めてで、構造体を学習しています。サイズ 30 の char ポインターを使用しようとしmallocていますが、セグメンテーション エラー (コア ダンプ) が発生しています。インターネットで検索しましたが、これを解決できません。どんな助けでも大歓迎です。
おそらくchar*、構造体のメンバーに間違ってアクセスしていますか?

typedef struct{
int x;
int y;
char *f;
char *l;
}str;

void create_mall();

void create_mall() //Malloc the struct
{
str *p;
p->f = (char*)malloc(sizeof(char)*30);  // segmentation fault here
p->l = (char*)malloc(sizeof(char)*30);
printf("Enter the user ID:");
scanf("%d",&p->x);
printf("\nEnter the phone number:");
scanf("%d",&p->y);
printf("\nEnter the First name:");
scanf("%29s",p->f);
printf("\nEnter the Last name:");
scanf("%29s",p->l);
printf("\nEntered values are: %d %d %s %s\n",p->x,p->y,p->f,p->l);
}

int main(void)
{
create_mall();
return 0;
}
4

5 に答える 5

8

これがあなたの問題です:

str *p;

のインスタンスへのポインタを宣言しましたがstr、値で初期化していません。この変数をスタックに移動する必要があります。

str p;

...またはmalloc最初にそれのためのいくつかのメモリ:

str *p = (str*)malloc(sizeof(str));
于 2012-10-18T05:04:22.890 に答える
5

構造体自体にスペースを割り当てることはなく、構造体へのポインタのみを割り当てます。

次のようなものを試してください:

str *p = malloc(sizeof(str));
于 2012-10-18T05:04:10.067 に答える
2

多くの人が指摘しているように、そのstr構造体のフィールドを書き込む前に、その構造体にメモリを割り当てる必要があります。

Cでこれを行うための最良の方法は次のとおりです。

p = malloc(sizeof *p);

これには次の利点があります。

  1. Cではキャストは不要であり、キャストがあると実際のエラーが隠される可能性があるため、キャストはありません。
  2. 演算子を使用して、の値ポイントにsizeof必要なストレージの量を計算することにより、型情報の重複はありません。p

次に文字列スペースを割り当てると、次のように簡略化できます。

p->f = malloc(30); 

なぜなら:

  1. まったく同じ理由で、キャストはありません。
  2. Cは常に1であることを保証してsizeof (char)いるので、何も追加しないように使用すると、1 * 30常に。になり30ます。

最後に、失敗して戻る可能性があるため、使用する前に必ずの戻り値を確認する必要があります。malloc()NULL

于 2012-10-18T07:48:07.197 に答える
0

関数の戻り値でNULL値をチェックしますmalloc()

また、str *p;<は初期化されません。

pを次のように初期化しますstr *p = malloc(sizeof(str));

于 2012-10-18T05:06:20.240 に答える
0

問題はここにあります。

str *p;   ---> Problem Line 1<br>
p->f = (char*)malloc(sizeof(char)*30); ----> Problem  Line2
p->l = (char*)malloc(sizeof(char)*30);

str 型のポインタ p を宣言しました。
問題 1:
このポインターを NULL に初期化していません。したがって、 p は任意のものを指すことができます。
問題 2:
p は初期化されていないポインターであるため、p->f は、segfault の原因となっている任意の場所を指すことができます。以下は正しい方法です

str *p = NULL;
p = malloc(sizeof(str));
// Check p for NULL
memset(p, 0, sizeof(str));

これで、p が指す初期化されたメモリができました。これで、自由に使用できます。

于 2012-10-18T05:39:09.797 に答える