c - 指针、结构和 malloc()

标签 c pointers struct malloc variable-assignment

我编写了这个简单的程序来测试 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 之后 code>ca= malloc() 它指向别的东西……c->mat[i] 呢?如果我反之亦然怎么办?

最佳答案

cac->mat[1] 的副本,因此当您稍后更改 ca 以指向 malloc-ed列出它不再是 c->mat[1] 的副本,特别是如果你修改 ca 你也不会修改 c->mat[1]

如果 ca 不是一个指针而是一个 int 你不会想到,或者你会假设 a 在下面的例子中是 2 吗?

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

当然,如果 cac->mat[1] 的副本并且您更改了 *c 那么您也更改了 *(c->mat[1]).

关于c - 指针、结构和 malloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36090676/

相关文章:

c++ - 推荐哪个C/C++的跨平台UI框架...

C++ 分配节点指针

c - 关于C : pointer and Two-dimensional array

go - 将结构从字符串数组更改为深度数组

c - 结构体和结构体指针之间的区别

c - 使用 ncurses 编写文本

c - 在 ubuntu 中编译 c 程序时出错 "storage size of time_struct isn' t know"

delphi - 增加一个指针没有按照我计划的方式编译

arrays - 保存和加载结构数组的最佳做法是什么?

c - 如何消除一个多余的宏参数