2017-01-23 12 views
2

firstName部材を投入すると、セグメンテーション違反を作成し、(CONSTのchar *)を割り当てるポインタ型 - セグメンテーション障害以下

typedef struct{ 

    const char *firstName; 
    const char *lastName; 
}PersonDetails; 

typedef struct{ 

    const long *sinKey; 
    PersonDetails *value; 
}Person; 

int main(void){ 
    .... 
    Person *person = malloc(sizeof(Person)); 
    const long key1 = 364222888L; 
    printf("Before key assignment\n"); 
    person->sinKey = &key1; 
    printf("Before first name assignment\n"); 
    person->value->firstName = "Sham"; 
    printf("Before last name assignment\n"); 
    person->value->lastName = "S"; 
    .... 
} 

Personの表現であります

const char *firstNameは不変の文字列を保持します。この不変の文字列は.rodataセクションに格納されます。 firstnameはポインティング位置を変更することができます。


しかし、以下

$ ./pq.exe 
... 
Before key assignment 
Before first name assignment 
Segmentation fault (core dumped) 

どのようにこの問題を解決するために、出力のですか?

+1

'value'は割り当てられていません... – LPs

答えて

10

あなたは

Person *person = malloc(sizeof(Person)); 

を行うと、あなただけperson構造にメモリを割り当てます。 person->valueのメモリを割り当てない。 も初期化person->valueなので、その値は不定になり、逆参照すると未定義の動作になります。

私のお勧めはではなく、person->valueのポインタを使用しています。単純な構造(ポインタではない)のインスタンスです。無関係なノートで


、あなたの実際のコードに別の関数に構造を作成する場合は特に、そのポインタperson->sinKeyに注意してください。あなたが代入すると、person->sinKeyはローカル変数を指すようになります。ローカル変数は、関数が返ってから範囲外になります。

main関数で構造体を作成すると、person->sinKeyを指す変数の存続期間がプログラムの有効期間になるので、これは機能します。

これは、上記の問題と一緒に、私はあなたがポインタをそれほど使用する理由を不思議に思っています。ポインタは、特に(相対的な)初心者にとって、コードの問題の主な原因です。

+0

' PersonDetails value'メンバーですか?上記のPersonDetailsはどこですか? – overexchange

+0

@overexchangeはい、正確です。 –

+0

間違っています。 '* sinKey'を維持することによって付加価値はありません – overexchange

2

あなたはvalueメンバー

person->value = malloc (sizeof(PersonDetails)); 

のための割り当てを追加する必要がありますそして、あなたは常に

if (person->value != NULL) 
{ 
    // YOUR STUFF 
} 
2

このmalloc戻り値を、確認する必要があります。

Person *person = malloc(sizeof(Person)); 

が十分ではありません。

person-> valueのメモリも割り当てる必要があります。

Person *person = malloc(sizeof(Person)); 
person->value = malloc(sizeof(PersonDetails)); 
0

あなたがPersonDetails *valueを使用する場合、あなたはmalloc()で、このためのいくつかの領域を割り当てる必要があります。さもなければどこにでも指していないちょうどぶら下がっているポインタ。

@プログラマが提案したように、PersonDetails valueを使用するだけで、ポインターではなく、割り当ては必要ありません。

あなたがこのアプローチを使用する場合は、あなたのコードは次のようになります。あなたがconst long *sinKey;を使用する理由

#include <stdio.h> 
#include <stdlib.h> 

typedef struct{ 
    const char *firstName; 
    const char *lastName; 
}PersonDetails; 

typedef struct{ 
    const long *sinKey; 
    PersonDetails value; 
}Person; 


int main(void) { 
    Person *person = malloc(sizeof(Person)); 
    const long key1 = 364222888L; 

    person->sinKey = &key1; 
    printf("%ld\n", *(person->sinKey)); 

    person->value.firstName = "Bob"; 
    printf("%s\n", person->value.firstName); 

    person->value.lastName = "Smith"; 
    printf("%s\n", person->value.lastName); 

    return 0; 
} 

は、私はまだわからないのですか?これは本当にポインタである必要がありますか?

関連する問題