c结构指针数组与结构指针malloc

c结构指针数组与结构指针malloc,c,arrays,struct,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数据{ int-val; }; 内部主(空){ 结构数据**var=malloc(3*sizeof(结构数据)); (*var)->val=6;//val); 返回0; }

作品:

分段故障:

struct data{
    int val;
};

int main(void){
    struct data *var[2];
    (*var)->val = 6;
    printf("%d\n", (*var)->val);
    return 0;
}
struct数据{
int-val;
};
内部主(空){
结构数据**var=malloc(3*sizeof(结构数据));
(*var)->val=6;//val);
返回0;
}

有人能解释一下为什么会出现segfault,并给我一个对segfault代码进行最小更改的工作示例,我能理解。指针没有
malloc
'ed,你正在取消引用一个无效指针,因为你的数组是一个poitner数组,它的元素没有指向有效内存

试试这个

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;
}

您是否包含了
stdlib.h
stdio.h
?当然,我没有收到警告。是的,当然您没有收到警告,编译器不关心也不担心指针的有效性,并且您没有
malloc()
var[0]pointer.in linux ubuntu中,如果使用malloc而不包含stdlib,则我将获取隐式声明。。。。。。。使用var[0]??我试过了,“wroks”示例有未定义的行为,因为代码访问的偏移量是从*var点开始的,但是*var没有被设置为指向任何特定的(比如malloc'd)内存区域。因此,这是一个seg故障事件,正在等待发生。这完全取决于堆栈包含的特定垃圾,struct data*var[2]恰好指向该垃圾。。那么var指向的是什么呢???请给我一个例子,它的malloc指针结构比我所理解的要复杂得多。@user3763903现在我明白了,你的第二个例子是偶然工作的,但它并不正确。谢谢,我现在明白了第一点**var指向内存和than*var。。ok thx例如这行:'var[0]=malloc(sizeof(var[0][0]);'更好/更清楚地写为:“var[0]=malloc(sizeof(struct data));”而且,没有未初始化的指针,后跟:“var[1]=malloc(sizeof(struct data));”当然,两个内存分配都需要通过以下方式释放:free(var[0]);自由(var[1]);1.清晰地可能是。。。2.是的,初始化所有指针会很好。
#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;
}
#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;
}