【问题标题】:Pointer to a struct指向结构的指针
【发布时间】:2014-10-28 16:03:10
【问题描述】:

我正在尝试更多地理解指针,但在这个示例中遇到了问题。

 typedef struct{
    int areaCode;
    int streetNumber;
 }Address;
 Address *addr;
 addr->areaCode = 10000;
 printf("%d\n", addr->areaCode);

我遇到了分段错误,似乎无法理解原因。

addr 是一个地址结构的指针,所以我也试过了:

 *addr->areaCode = 10000;

还有一个“间接需要指针操作数”,有什么想法吗?

【问题讨论】:

    标签: c pointers struct


    【解决方案1】:
    Address *addr;
    

    您只声明了一个指针addr,但它指向某个未知的地方。你没有为它分配内存空间。

    要修复它,请更改为

    Address *addr = malloc(sizeof(Address));
    

    【讨论】:

    • 别忘了在程序终止前释放内存!
    【解决方案2】:

    您还没有为结构对象分配内存。要么使用malloc(),要么只声明Address类型的变量而不是指向Address的指针(在这种情况下,访问成员使用.运算符而不是->)。

    选项一:

    Address *addr = malloc(sizeof *addr); // don't forget #include <stdlib.h>
    if (addr == NULL) {
        // handle failed allocation
    }
    // ...
    free(addr); // free(addr), addr = NULL; if you like
    

    选项二:

    Address addr;
    

    【讨论】:

      【解决方案3】:

      addr 未初始化,因此包含一些“随机”值。取消引用未初始化的指针会导致...问题。
      访问不允许的内存 = 分段错误。
      访问没有 seg-fault 的随机内存会导致内存损坏。

      你可以这样做:

      Address myAddress;
      Address *addr = &myAddress;
      

      这将起作用。先分配再获取指针。
      这将产生一个指向堆栈上Address 的指针。小心它在函数结束时超出范围。

      你也可以这样做:

      Address *addr = malloc(sizeof(Address));
      

      这在堆上分配,所以实际的Address 不会超出范围。但是你需要记住free(addr); 否则你会引入内存泄漏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        • 2012-03-28
        相关资源
        最近更新 更多