0

C言語を学んでいます。誰でも次の結果を理解するのを手伝ってもらえますか:

int main()
{
  struct xx
  {
    int x;
    char name[];
  };
  struct xx *s;
  printf("%d",s->x);
  printf("%s",s->name);
   return 0;
}

出力:- セグメンテーション違反

私は別のコードを書きました:

struct Foo
{
  char *pName;
};

int main()
{
  struct Foo *obj = malloc(sizeof(struct Foo));
  strcpy(obj->pName,"Your Name");
  printf("%s", obj->pName);
  return 0;
} 

output : セグメンテーション違反 (コアダンプ);

セグメンテーション違反が発生するのはなぜですか? コードの何が問題になっていますか? core dumped とはどういう意味ですか?

4

8 に答える 8

5
  1. 構造体定義内で値を代入しない
  2. ホストされた環境 (OS を備えたシステムで実行中) で作業していると仮定するとmain()、標準形式 ( ) を持ち、値int main(void)を返す必要があります。int
  3. 例 1 では、ポインタにメモリを割り当てていません。s
  4. メモリを解放しなかった2番目の例でメモリリークが発生しましたobj
  5. pName2番目の例では、メモリを割り当てませんでしたstruct Foo
  6. コア ダンプは、何かが非常にうまくいかなかったことを意味します。
于 2013-04-08T14:03:32.857 に答える
1

構造体に対してポインターが宣言されていますが、ポインターは初期化されておらず、構造体も作成されていません。 sは、読み取りを試みるランダムなメモリ空間を指しています。

pName2 番目のケースでは、メモリが割り当てられていないポインタがあります。また、ランダムなメモリ空間を指しています。文字列リテラルから文字列をコピーし、ランダムなメモリ位置に書き込みます。

于 2013-04-08T14:04:02.297 に答える
0

まず、変数 s のサイズを割り当てる必要があります。これは、コンパイラが変数に割り当てる必要があるメモリのサイズを理解していないためです。そのため、次のようにメモリを割り当てる必要があります。 S=(struct xx*)malloc (sizeof(struct xx));

于 2016-12-07T14:37:17.977 に答える
0

例 1 では、ポインターを宣言しましたが、初期化していません。したがって、ポインターは不明な場所を指しています。

例 2 では、同じ理由で obj->pname がメモリの不明な部分 (初期化されていない) を指しているため、strcpy 内でアクセスしようとすると、プログラムがクラッシュします。

あなたがしなければならなかったこと: メモリのランダムな (不正な?) 部分ではなく、あなたに属するメモリを指すようにポインタにメモリを割り当てる必要がありました。

于 2013-04-08T14:07:48.887 に答える
0
   #include <stdio.h> 
   #include <stdlib.h> 
   int main()
   {
     struct xx
     {
       int x;
       char name[25];  /* mention size of array */
     };

     struct xx *s;
     s=(struct xx *)malloc(sizeof(struct xx));   /* allocate the size for pointer variable */
     printf("Enter the value\n");
     scanf("%d",&s->x);           /*get the value */
     printf("Enter the name\n");
     scanf("%s",s->name);         
     printf("%d\n",s->x);          /*get the value */
     printf("%s\n",s->name);
     return 0;
   }
于 2014-12-02T11:45:50.853 に答える