【发布时间】:2016-07-05 13:54:15
【问题描述】:
我制作了这个简单的程序来测试C编程的struct、指针和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] 是NULL 所以是ca = c->mat[1] = NULL,在ca= malloc() 之后它指向别的东西......那么c->mat[i] 呢?如果我反过来呢?
【问题讨论】:
-
通过打印值或使用调试器自己尝试如何?你会发现的。
-
将
c->mat[1]更改为ca,它将按预期工作。您分配给ca而不是c->mat[1]。这个初始化list * ca = c->mat[1];没有用,因为在下一行你会覆盖ca的值。 -
顺便说一句,您可以通过正确缩进来提高代码的可读性!-)
标签: c pointers struct malloc variable-assignment