指针、结构和 malloc()
Pointers, struct and malloc()
我编写了这个简单的程序来测试 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;
}
问题是我在第 2 天出现段错误 printf()
... c->mat[1]
和 ca
不应该是等价的吗?
它们不应该指向相同的分配内存吗?
最初 c->mat[1]
是 NULL
,ca = c->mat[1] = NULL
也是 ca = c->mat[1] = NULL
,在 ca= malloc()
之后它指向其他东西...... c->mat[i]
呢?如果我反之亦然怎么办?
ca
是 c->mat[1]
的副本,因此当您稍后更改 ca
以指向 malloc-ed 列表时,它不再是 c->mat[1]
的副本特别是如果你修改 ca
你不会同时修改 c->mat[1]
.
如果 ca
不是一个指针而是一个 int
你不会想到,或者你会假设 a 在下面的例子中是 2 吗?
int a = 3;
int ca = a;
ca = 2;
当然,如果 ca
是 c->mat[1]
的副本,并且您更改了 *c
,那么您也更改了 *(c->mat[1])
。
list * ca = c->mat[1];
将 ca 设置为 NULL
ca = (list *)malloc(sizeof(list));
将 ca 设置为指向 malloc 提供的新内存,但 c->mat[1] 仍指向 NULL。
你可以有一个指向指针c->mat[1]:
的指针
list ** ca = &c->mat[1];
(*ca) = malloc(sizeof(list));
(*ca)->val = 2;
(*ca)->next = NULL;
别忘了使用 free()。
c->mat[0]
的代码是正确的,可以用于 c->mat[1]
。
或者您通过将 malloc
的结果分配给 c->mat[1]
然后将指针复制到 ca
来修复 c->mat[1]
代码
c->mat[1] = malloc(sizeof(list));
list *ca = c->mat[1];
ca->val = 2;
ca->next = NULL;
另一种解决方案是将ca
复制到最后的c->mat[1]
list *ca = malloc(sizeof(list));
ca->val = 2;
ca->next = NULL;
c->mat[1] = ca;
我编写了这个简单的程序来测试 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;
}
问题是我在第 2 天出现段错误 printf()
... c->mat[1]
和 ca
不应该是等价的吗?
它们不应该指向相同的分配内存吗?
最初 c->mat[1]
是 NULL
,ca = c->mat[1] = NULL
也是 ca = c->mat[1] = NULL
,在 ca= malloc()
之后它指向其他东西...... c->mat[i]
呢?如果我反之亦然怎么办?
ca
是 c->mat[1]
的副本,因此当您稍后更改 ca
以指向 malloc-ed 列表时,它不再是 c->mat[1]
的副本特别是如果你修改 ca
你不会同时修改 c->mat[1]
.
如果 ca
不是一个指针而是一个 int
你不会想到,或者你会假设 a 在下面的例子中是 2 吗?
int a = 3;
int ca = a;
ca = 2;
当然,如果 ca
是 c->mat[1]
的副本,并且您更改了 *c
,那么您也更改了 *(c->mat[1])
。
list * ca = c->mat[1];
将 ca 设置为 NULL
ca = (list *)malloc(sizeof(list));
将 ca 设置为指向 malloc 提供的新内存,但 c->mat[1] 仍指向 NULL。
你可以有一个指向指针c->mat[1]:
的指针list ** ca = &c->mat[1];
(*ca) = malloc(sizeof(list));
(*ca)->val = 2;
(*ca)->next = NULL;
别忘了使用 free()。
c->mat[0]
的代码是正确的,可以用于 c->mat[1]
。
或者您通过将 malloc
的结果分配给 c->mat[1]
然后将指针复制到 ca
c->mat[1]
代码
c->mat[1] = malloc(sizeof(list));
list *ca = c->mat[1];
ca->val = 2;
ca->next = NULL;
另一种解决方案是将ca
复制到最后的c->mat[1]
list *ca = malloc(sizeof(list));
ca->val = 2;
ca->next = NULL;
c->mat[1] = ca;