2012-01-19 20 views
0

"stuList [1] .name"を入力しているときにエラーが発生し、プログラムがクラッシュしました。これをどうやって解決するのですか?構造体内のポインタを使用

#include <stdio.h> 
#include <conio.h> 

typedef struct student 
    { 
     int id; 
     char *name; 
     float percentage; 
    } student; 

int main() 
{ 
    student stuList[3]; 
    stuList[0].name = "vermidonhapic"; 
    stuList[2].name = "didiervermiyer"; 

    scanf("%s\n",&stuList[1].name); 

    printf(" name is: %s \n", stuList[0].name); 
    printf(" name is: %s \n", stuList[2].name); 
    printf(" name is: %s \n", stuList[1].name); 

    system("PAUSE"); 
} 
+2

'%s"形式の 'scanf()'は、ポインタが適切に割り当てられたメモリを指していても、非常に危険です。任意の長い文字列を宛先バッファに読み込みます。あなたの配列の終わりを越えて書くことを防ぐ方法はありません。 –

答えて

1

stuList[1].nameのメモリを割り当てられませんでした。ヒープからmallocを割り当てたり、スタックに割り当てる必要があります。

私はすべてのエラーチェックを省略しました
stuList[1].name = malloc(MAX_NAME_LENGTH);//heap allocation 
//use stuList[1].name 
free(stuList[1].name); 

char buffer[MAX_NAME_LENGTH];//stack allocation 
stuList[1].name = buffer; 

、オーバーランニングバッファに対する保護など

stuList[1].nameがポインタであるので、あなたはあなたのscanfにそのアドレスを服用中に間違っています。

2

stuList[1].nameは、有効なオブジェクトを指すように初期化されていないため、無効なポインタです。

stuList[1].nameのメモリを(mallocの関数を介して)動的に割り当てる必要があります。scanfは割り当てられたオブジェクトに書き込むことができます。

stuList[1].name = malloc(size_enough_to_store_your_string); 

また、stuList[1].nameので、あなたのscanf関数呼び出しでstuList[1].nameなく&stuList[1].namecharへのポインタへのポインタ)を使用する必要がありますcharへのポインタです。このコマンドで

+1

いいえ、ゴミを指します。 – amit

+0

@amitありがとう、私は文字列リテラルポインタの割り当てを誤読しました。一定。 – ouah

2

scanf("%s\n",&stuList[1].name);

あなたが実際に必要なメモリを割り当てることなく入力から文字列をスキャンしています。

これは、あなたのものではない不明なアドレスにデータを書き込もうとします。その結果、セグメント化エラーが発生します。

修正するには、最初にメモリ:stuList[1].name = malloc(MAX_LENGTH);を割り当てます。その後は、stdinから文字列をスキャンします。

2

nameは、自分が所有するメモリを指していないポインタなので、メモリを書き込むとメモリが破壊されます。 malloc()でメモリを割り当てたり、ポインタではなく配列にする必要があります。

+0

おかげで男:Dが必要 – javazade

関連する問題