0

cで人のリンクリストを作成しようとしています。私のすべてのメソッドは、main()(ユーザーからコマンドを読み取るために)whileループに入れるまで機能します。すべてがコンパイルされますが、実行しようとするとクラッシュし、ランダムな値が返されます。ここに私のコードの一部があります。

構造:

struct Person{
             const char* name;
             const char* sex;
             int age;
             struct Person* next;
} *head;

メソッドの挿入:

void insert(struct Person* h, char*n, char* s, int a){

    for(; h->next != NULL; h=h->next){}

    struct Person* p = (struct Person*) malloc(sizeof(struct Person)); 
    p->name=n;
    p->age=a;
    p->sex=s;
    p->next=NULL;
    h->next=p;
}

それが機能しないメイン:

int main()
{
    struct Person Maciek={"Maciek", "Male", 20, NULL};
    head = &Maciek;
    int comand = 0;


    while(comand != 6){
        printf("Choose command:\n 1-insert person \n 2-delete by index \n 3-delete by name \n 4-display by index \n 5-print whole list \n 6-exit\n");
        scanf("%d", &comand);
        if(comand == 1){
            printf("Name, Gender, Age\n");
            char* name;
            char* sex;
            int age;            
            scanf("%s, %s, %d", &name, &sex, &age);
            printf("Name %s, Sex %s, Age %d", name, sex, age);

            insert(head, name, sex, age);
        }

        if(comand == 2){
            printf("2\n");
        }

        if(comand == 3){
            printf("3\n");
        }

        if(comand == 4){
            printf("4\n");
        }

        if(comand == 5){
            printf("5\n");
        }

    }

     return 0;
}

私は C/C++ にまったく慣れていないので、助けていただければ幸いです。

4

2 に答える 2

2
    if(comand == 1){
        printf("Name, Gender, Age\n");
        char* name;
        char* sex;
        int age;            
        scanf("%s, %s, %d", &name, &sex, &age);

ここでは、ダングリング ポインター (メモリ内の任意の場所を指している) を使用しています。mallocメモリを割り当てるか、char 配列を使用する必要があり&ます。次のように実行できます (このコードはバッファ オーバーフローに対して脆弱です。本番コードでは使用しないでください。 +の使用を検討してください)。scanfchar*char**fgetssscanf

char name[50];
char sex[20];
int age = 0;
scanf("%s, %s, %d", name, sex, &age);

あなたの挿入機能で:

 struct Person* p = (struct Person*) malloc(sizeof(struct Person)); 
 p->name=n;
 p->age=a;
 p->sex=s;

n の内容を p->name にコピーするのではなく、p->name を n に置き換えています。あなたがしたい:

struct Person *p = malloc(sizeof(struct Person));
p->name = malloc(strlen(n)+1);
if(p->name == NULL) {
  //error handling...
}
strcpy(p->name, n);
p->sex = malloc(strlen(s)+1);
if(p->sex == NULL) {
  //error handling...
}
strcpy(p->sex, s);
p->age = a;
于 2013-05-25T18:05:54.097 に答える
1

割り当てられたメモリで初期化されていないポインタに文字列を読み込んでいます。

于 2013-05-25T18:06:47.257 に答える