0

私はCを学ぼうとしていますが、今は構造体で遊んでいます。私は次のコードを持っています:

#include <string.h>

struct user {
  unsigned int utime;
  char *username;
};

void main()
{
  char username[] = "root";
  struct user *u;
  strcpy(u->username, username);
}

しかし、実行しようとすると、セグメンテーション違反が発生します。どうしたの?

4

5 に答える 5

3

u構造体へのポインタですが、まだメモリを割り当てていません。行は である必要があります struct user *u = malloc(sizeof(struct user))usernameさらに、を呼び出す前に、構造体内のポインタにメモリを割り当てる必要もありますstrcpy

于 2012-06-14T08:42:58.430 に答える
2

クラッシュ (セグメンテーション違反など) が発生したときに最初にすべきことは、プログラムをデバッガーで実行することです。クラッシュの場所を特定するのに役立ち、変数を調べてクラッシュの原因を確認することもできます。

ただし、あなたの場合は非常に簡単です。

struct user *u;
strcpy(u->username, username);

uまたはにメモリを割り当てていませんu->username。つまり、uはメモリ内の任意の場所を指すことができ、 も同様ですu->username

于 2012-06-14T08:43:11.257 に答える
0

二つのこと

構造体変数「struct user *u;」に割り当てていません。

また、structore で *username にメモリを割り当てていません

働くために

 #include <string.h>
 struct user {
 unsigned int utime;
 char *username;
 };

 void main()
 {
    char username[] = "root";
    struct user *u=malloc(sizeof(struct user));
    u->username=malloc(strlen(username)+1);
    strcpy(u->username, username);
}  

構文エラーがある場合は無視してください

于 2012-06-14T08:45:46.403 に答える
0

もう 1 つの方法は、u を単純な変数として使用することstruct user uです。次に、次のように「.」を使用して utime またはユーザー名にアクセスします。

u.utime = ...;
u.username = ...;
于 2012-06-14T08:46:29.293 に答える
0

並行して、メモリ レイアウトについても理解し、何がどこにあるのかを推論する必要があります。これの出発点は-スタンフォードポインターpdf です。学習していて行き詰まったら、フロー、メモリアクセスを紙に描いてから、デバッガーに移動してみてください。私がCを最初に学んだとき、私はこれをしませんでした-メモリの視覚化は、同僚から学んだこと/オンラインのいくつかの記事を読んだことから、人をより優れたプログラマー/デバッガーにするように思われる特性です.

于 2012-06-14T12:28:25.370 に答える