私は、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
のですか?そして、もし私がその反対者をしたら?
で
c->mat[1]
にca
をコピーすることです値を印刷するか、デバッガを使って自分で試してみてはいかがですか?あなたは知っているでしょう。 – edmz(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) –
変更 'C->マット[' malloc'の戻り値をキャストしていない]を[1] '' ca 'にすると期待どおりに動作します。あなたは 'ca 'に' c-> mat [1] 'を割り当てませんでした。この初期化 'list * ca = c-> mat [1];は' ca'の値を上書きする次の行のようには役に立たない。 – alk