2014-02-25 35 views
1
#include<stdio.h> 
#include <stdlib.h> 

struct a1 { 
    int value ; 
}; 

struct cf { 
    struct a1 *a1; 
    int val; 
}; 

main(){ 

    struct cf *cf = malloc(sizeof(struct cf)); 

    cf->a1->value = 45; 
    printf("cf->a1->value = %d \n",cf->a1->value); 

} 

当我绑定执行此C代码我得到一个分段错误(核心转储)!为什么在下面的C代码中发生分段错误

+4

您已经为'cf'分配的空间,但是你有什么理由认为它'结构a1'指针,'a1',指向访问内存? 'cf-> a1'是一个没有意义的值,你不应该试图解引用它。你需要一个介于中间的'cf-> a1 = malloc(sizeof(struct a1));'。 –

回答

3

原因是你分配cf所需的内存,但不是a1。 你必须做一些像

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

struct a1 { 
    int value ; 
}; 

struct cf { 
    struct a1 *a1; 
    int val; 
}; 

main(){ 

    struct cf *cf = malloc(sizeof(struct cf)); 
    cf->a1 = malloc(sizeof(struct a1)); 
    cf->a1->value = 45; 
    printf("cf->a1->value = %d \n",cf->a1->value); 

} 
0

你得到分段错误,因为你没有为a1分配的内存。 您还应该将malloc从void*改为struct cf*,并且如果一切顺利,则声明主要功能为int main()return 0。 这是你的问题的解决方案:对于结构cf

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

struct a1 { 
    int value ; 
}; 

struct cf { 
    struct a1 *a1; 
    int val; 
}; 

int main(){ 

    struct cf *cf = (struct cf*)malloc(sizeof(struct cf)); 
    cf->a1=(struct a1*)malloc(sizeof(struct a1)); 

    cf->a1->value = 45; 
    printf("cf->a1->value = %d \n",cf->a1->value); 

} 
+0

你不会在C中投入'malloc' - [我投出malloc的结果吗?](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – crashmstr

+0

@crashmstr如果你使用gcc,你会得到一个语法错误,如果你不转换 – WileTheCoyot

+0

另一方面,你不应该得到一个C编译器,C++语法错误,是的,你需要。问题被标记为C虽然。 – crashmstr

0

malloc(sizeof(struct cf));现在你在这里分配内存拥有成员为指针a1 & val。指针a1指向结构类型a1,其中包含成员value。但malloc()只分配指针的内存,但它没有为成员分配内存,例如value。在那里,你试图将45写入未知的存储器。

分配内存的结构a1太为,cf->a1 = malloc(sizeof(struct a1));

相关问题