[英]Pointer to struct within the nested structs
我正在尝试运行以下代码(在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-> test2 [0]得到了一个段错误.smallstruct [0] .smallstruct = 123; 。 评论部分正在运行,没有错误。 这种行为的原因是什么? 我不是很精通C,所以我会感激任何帮助。
我可以看到您的代码有三个问题:
这是有效的:
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;
尝试改变:
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个字节。
您没有为内部结构分配任何内存。 sizeof(test1)只有足够的空间容纳3个指针,而不是结构的整个结构。
另外,该语句中有5(!)个解引用运算符。 即使你已经分配了足够大的内存块,你也没有以确保它连续的方式放置东西 - 你要求它从一个块跳到另一个块5次。
我编译了问题海报@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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.