C 结构体指针数组 vs 结构体指针 malloc

标签 c arrays struct malloc

作品:

struct data{
    int val;
};

int main(void){
    struct data *var[2];
    (*var)->val = 6;
    printf("%d\n", (*var)->val);
    return 0;
}

段错误:

struct data{
    int val;
};

int main(void){
    struct data **var = malloc(3 * sizeof(struct data));
    (*var)->val = 6;   // <- crash
    printf("%d\n", (*var)->val);
    return 0;
}

有人可以解释为什么会出现段错误,并给我一个工作示例,对我可以理解的段错误代码进行最小的更改。

最佳答案

指针未经过 malloc,您正在取消引用无效指针,因为您的数组是指针数组,并且它的元素未指向有效内存。

试试这个

#include <stdio.h>
#include <stdlib.h>

struct data
{
    int val;
};

int main(void)
{
    struct data *var[2];
    /* You need to malloc before dereferencing `var[0]` */
    var[0] = malloc(sizeof(var[0][0]));
    if (var[0] != NULL)
    {
        var[0]->val = 6;
        printf("%d\n", var[0]->val);

        free(var[0]);
    }
    return 0;
}

此外,使用 (*var)->val = 6 绝对不必要且令人困惑。

在第二种情况下,您也应该做几乎相同的事情,除了指针数组是指向指针数组的指针,因此也需要 malloc() ,所以您的第二个示例意外地工作,因为有足够的内存 malloc()ed 但它也是错误的,你应该这样做

#include <stdio.h>
#include <stdlib.h>

struct data
{
    int val;
};

int main(void)
{
    struct data **var;
    var = malloc(2 * sizeof(var[0]));
    if (var == NULL)
        return -1;
    /* You need to malloc before dereferencing `var[0]` */
    var[0] = malloc(sizeof(var[0][0]));
    if (var[0] != NULL)
    {
        var[0]->val = 6;
        printf("%d\n", var[0]->val);

        free(var[0]);
    }
    free(var);
    return 0;
}

关于C 结构体指针数组 vs 结构体指针 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28927752/

相关文章:

C - 将结构设置为 null(赋值中的类型不兼容)

c - 将 "array of pointers"传递给函数

c - C 中的静态结构不改变值

javascript - 在 Feathers JS 中从 rethinkdb 中查找嵌套数组对象

c - 如何正确释放链表的所有元素?

c - 为什么我的 C 代码无法识别结构数组并重复用户输入?

collections - 迭代时无法分配给不可变的索引内容

c - 采用不同数据类型的多个元素的数组

c - 如何在 c 中存储字符串数组中的随机字符串?

c++ - 类数组和赋值运算符