我正在尝试运行以下代码(在fedora 11 i586上的gcc 4.3中):
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
struct s_smallstruct{
int smallstruct;
};
struct s_test2{
char * test2;
struct s_smallstruct* smallstruct;
};
struct s_test3{
char * test3;
struct s_smallstruct * smallstruct;
};
struct s_test1{
char * test1;
struct s_test2 * test2;
struct s_test3 * test3;
};
int main(){
struct s_test1 *test1 = (struct s_test1 *) malloc( sizeof test1 );
test1->test2[0].smallstruct[0].smallstruct = 123;
int num = test1->test2[0].smallstruct[0].smallstruct;
// struct s_smallstruct * smallstruct = (struct s_smallstruct *) malloc( sizeof smallstruct );
// smallstruct[0].smallstruct =12;
// int num = smallstruct[0].smallstruct;
printf( "%d\n" , num );
return EXIT_SUCCESS;
}
但我在test1-&gt; test2 [0] .smallstruct [0] .smallstruct = 123; 。评论部分正在运行,没有错误。这种行为的原因是什么?我对C不太熟练,所以我会感激任何帮助。
答案 0 :(得分:7)
我可以看到您的代码存在三个问题:
这是有用的:
const int length = 2;
struct s_test1 *test1 = malloc( length * sizeof *test1 );
test1->test2 = malloc( length * sizeof *test1->test2 );
test1->test2->smallstruct = malloc( length * sizeof *test1->test2->smallstruct );
test1[1].test2[0].smallstruct[1].smallstruct = 123;
int num = test1[1].test2[0].smallstruct[1].smallstruct;
答案 1 :(得分:1)
尝试更改:
struct s_test1 *test1 = (struct s_test1 *) malloc( sizeof test1 );
到
struct s_test1 *test1 = (struct s_test1 *) malloc( sizeof struct s_test1 );
test1
是一个指针,在32位环境中是4个字节。
答案 2 :(得分:1)
您没有为内部结构分配任何内存。 sizeof(test1)只有足够的空间容纳3个指针,而不是结构的整个结构。
另外,该语句中包含5个(!)解除引用运算符。即使你已经分配了足够大的内存块,你也没有以确保它连续的方式放置东西 - 你要求它从一个块跳到另一个块5次。
答案 3 :(得分:0)
我编译了问题海报@systemsfault选择的标记为正确的代码,但是核心转储了。我希望在这里有一个健康和有益的讨论,为这个问题提供正确的解决方案。我也是stackoverflow的新手,所以如果我说错了,请随时纠正我。现在,我们走了......
由于旧的解决方案没有完成,我试图解决它的两个步骤。首先,我添加了for循环,但仍然由(a1)和(a2)引起了核心转储。
接下来,我用线(b1)和(b2)代替(a1)和(a2)。现在它编译并正确运行。
我已经清理了结构,使其更易于阅读:
#include <stdio.h>
#include <stdlib.h>
struct s_smallstruct{
int smallstruct;
};
struct s_test2{
struct s_smallstruct *smallstruct;
};
struct s_test1{
struct s_test2 *test2;
};
int main() {
int i, j, length = 2;
struct s_test1 *test1 = malloc( length * sizeof *test1 );
for (i=0; i<length; i++) {
//test1[i].test2 = malloc( length * sizeof *test1->test2 );//(a1)
test1[i].test2 = malloc( length * sizeof *test1[i].test2 );//(b1)
for (j=0; j<length; j++) {
//test1[i].test2[i].smallstruct = malloc( length * sizeof *test1->test2->smallstruct );//(a2)
test1[i].test2[j].smallstruct = malloc( length * sizeof *test1[i].test2[j].smallstruct );//(b2)
}
}
test1[1].test2[0].smallstruct[1].smallstruct = 123;
int num = test1[1].test2[0].smallstruct[1].smallstruct;
printf("num:%d\n", num);
return 0;
}