【问题标题】:Pointers, struct and malloc()指针、结构和 malloc()
【发布时间】: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-&gt;mat[1] 和ca 不应该是等价的吗?

它们不应该指向同一个分配的内存吗?

最初c-&gt;mat[1] 是NULL 所以是ca = c-&gt;mat[1] = NULL,在ca= malloc() 之后它指向别的东西......那么c-&gt;mat[i] 呢?如果我反过来呢?

【问题讨论】:

  • 通过打印值或使用调试器自己尝试如何?你会发现的。
  • 将c-&gt;mat[1] 更改为ca,它将按预期工作。您分配给ca 而不是c-&gt;mat[1]。这个初始化list * ca = c-&gt;mat[1]; 没有用,因为在下一行你会覆盖ca 的值。
  • 顺便说一句,您可以通过正确缩进来提高代码的可读性!-)

标签: c pointers struct malloc variable-assignment


【解决方案1】:

ca 是c-&gt;mat[1] 的副本,因此当您稍后将ca 更改为指向malloc-ed 列表时,它不再是c-&gt;mat[1] 的副本,特别是如果您修改ca,您会这样做也不要修改c-&gt;mat[1]。

如果ca 不是一个指针而是一个int,你就不会这样认为,或者你会假设a 在下面的例子中是2?

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

当然,如果ca 是c-&gt;mat[1] 的副本,并且您更改了*c,那么您也更改了*(c-&gt;mat[1])。

【讨论】:

    【解决方案2】:
    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()。

    【讨论】:

      【解决方案3】:

      c-&gt;mat[0]的代码是正确的,可以用于c-&gt;mat[1]。

      或者您通过将malloc 的结果分配给c-&gt;mat[1] 来修复c-&gt;mat[1] 代码,然后将指针复制到ca

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

      另一种解决方案是将ca复制到最后的c-&gt;mat[1]

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

      【讨论】:

        猜你喜欢
        • 2013-05-09
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 1970-01-01
        • 2012-04-18
        • 2016-07-30
        相关资源
        最近更新 更多