2016-03-18 20 views
2

私は、structをテストするために、この簡単なプログラムを作っポインタとCプログラミングのmalloc()ました:ポインタ、構造体とのmalloc()

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

typedef struct l { 
    unsigned val; 
    struct l * next; 
} list; 


typedef struct cont { 
    list ** mat; 
    unsigned riga; 
} container; 


int main(){ 

    container * c = (container *)malloc(sizeof(container)); 
    c->riga = 3; 
    c->mat = (list**)malloc(sizeof(list*)*3); 

    for(int i = 0; i<3 ;i++){ 
     c->mat[i] = NULL; 
    } 

    c->mat[0] = (list *)malloc(sizeof(list)); 
    c->mat[0]-> val = 4; 
    c->mat[0]-> next = NULL; 

    printf("val row 0: %d\n", c->mat[0]->val); 

    /*************************/ 

    list * ca = c->mat[1]; 
    ca = (list *)malloc(sizeof(list)); 
    ca->val = 2; 
    ca->next = NULL; 

    printf("val row 1: %d\n", c->mat[1]->val); 

    return 0; 
} 

問題は、私は第二printf()にセグメンテーション違反を得るということです... c->mat[1]caは等しくないはずですか?

同じ割り当てられたメモリを指してはいけませんか?当初

c->mat[1]のでca = c->mat[1] = NULLは何c->mat[i]について... ca= malloc()た後、それは何か他のものを指し、あるNULLのですか?そして、もし私がその反対者をしたら?

+0

c->mat[1]caをコピーすることです値を印刷するか、デバッガを使って自分で試してみてはいかがですか?あなたは知っているでしょう。 – edmz

+4

(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) –

+0

変更 'C->マット[' malloc'の戻り値をキャストしていない]を[1] '' ca 'にすると期待どおりに動作します。あなたは 'ca 'に' c-> mat [1] 'を割り当てませんでした。この初期化 'list * ca = c-> mat [1];は' ca'の値を上書きする次の行のようには役に立たない。 – alk

答えて

3

cac->mat[1]のコピーであるので、後でのmalloc-EDのリストを指すようにcaを変更すると、それはもうc->mat[1]のコピーではなく、あなたがcaを変更する場合は特に、あなたもc->mat[1]を変更しないでください。

caがポインタではなく、intの場合、それは期待できませんか、または次の例では2と仮定しますか?もちろん

int a = 3; 
int ca = a; 
ca = 2; 

cac->mat[1]のコピーであり、あなたが*cを変更した場合、あなたはまた、*(c->mat[1])を変更します。

2
list * ca = c->mat[1]; 

セットは

ca = (list *)malloc(sizeof(list)); 

セットはmalloc関数から与えられた新しいメモリを指すように、CAが、C->マットをNULLにCA [1]依然としてNULLを指します。

あなたは[1]ポインタC->マットへのポインタを持つことができます。

list ** ca = &c->mat[1]; 
(*ca) = malloc(sizeof(list)); 
(*ca)->val = 2; 
(*ca)->next = NULL; 

と(自由使用することを忘れないでください)。

1

c->mat[0]のコードは正しく、c->mat[1]に使用できます。

それとも、コード、その後c->mat[1]からmallocの結果を割り当てることによってc->mat[1]コードを修正してはca

c->mat[1] = malloc(sizeof(list)); 
list *ca = c->mat[1]; 
ca->val = 2; 
ca->next = NULL; 

へのポインタをコピーする別の解決策は、エンド

list *ca = malloc(sizeof(list)); 
ca->val = 2; 
ca->next = NULL; 
c->mat[1] = ca;