2016-09-14 7 views
-1
#include<stdio.h> 
#include<stdlib.h> 

struct keyVal 
{ 
    int key; 
    int val; 
}; 

int main() 
{ 

    struct keyVal *arr[5]; 
    int i; 
    for(i=0;i<5;i++) 
     printf("\n : %p  %p  ",&arr[i][0].val,&arr[i]); 
    printf("\n\n"); 
    printf("\n : %d  %d  ",arr[0][0].val,arr[0]->val); 
    printf("\n\n"); 

    for(i=0;i<5;i++) 
     printf("\n : %d  %d  ",arr[i][0].val,arr[i]->val); 
    printf("\n\n"); 

    return 0; 
} 

まず、for(; ;);arr[i][0] == arr[i]i = 0,1,2,3,4を意味し、arr[0][0]からarr[4][0]arr[0]arr[4]に同じ%p %pを生成します。Cプログラムでセグメント分割エラーが発生するのはなぜですか?

第2のfor(; ;);は、arr[i][0].keyarr[i]->key)の値(ガーベッジ値)を出力する必要があります。

我々は実行してキーにアクセスすることができます。

arr[i][0].key OR i = 0,1,2,3,4arr[i]->keyを。

+0

コンパイラの警告は何ですか? –

+2

'arr'は初期化されていないので、コード全体は[UB](https://en.wikipedia.org/wiki/Undefined_behavior)です。 – LPs

+0

少し質問を再フォーマットできますか?提示されているように、コードは非常に不明です。 – kfb

答えて

0

あなたはメモリが、それがセグメンテーションフォールトに走ったThatsなぜ割り当てられていないされているKEYVAL構造体へのポインタ変数5ポインティングを取りました。 mallocを使用してメモリを割り当ててから使用してください。

0

& arr [i] [0] .valではなく、& arr [i] .valを使用できます。

0

説明を参照してください。
私はあなたを約malloc and freeを見つける

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

struct keyVal { 
    int key; 
    int val; 
}; 

int main() 
{ 
    /* 
     You are creating an array composed of 5 cells. 
     Each cell is bound to contain an address of a variable 
     of which should be a keyVal. 
    */ 
    struct keyVal *arr[5]; 
    int i; 

    /* 
    Use curly brackets to wrap the content of the loop 
    even though you only have one instruction it helps for readability 
    and prevents errors. 
    */ 
    for(i = 0; i < 5; i++) { 
     printf(": %p | %p\n", &arr[i][0].val, &arr[i]); 
    } 

    /* 
    You are getting a segmentation fault here because you are trying to access something which does not exist. 
    */ 
    //printf(": %d - %d\n", arr[0][0].val, arr[0]->val); 

    /*************************************************** 
    BEGIN CORRECTION :the field val will be initialized. 
    ***************************************************/ 

    arr[0] = malloc(sizeof(struct keyVal)); // Allocating "sizeof(struct keyVal)" bytes in memory. 
    arr[0]->val = 42; // Assigning a value to the field val in the first cell of arr. 
    printf(": %d | %d\n", arr[0][0].val, arr[0]->val); // Now we can print as a value now exists. 

    /*************************************************** 
    END CORRECTION 
    ***************************************************/ 
    /* 
    Again use brackets ;p 
    I think you can solve that one on your own, now. 
    */ 
    for(i = 0; i < 5; i++) { 
     printf(": %d | %d \n", arr[i][0].val, arr[i]->val); 
    } 
    // Don't forget to free "ALL" the memory allocated with malloc. 
    free(arr[0]); 

    return 0; 
} 

それを自分で修正することができます願っています目的に最後for {...}を残しました。

関連する問題