我想迭代通过null终止的结构数组.虽然循环工作正常,但当我尝试访问任何结构字段时,我得到"段错误"作为响应.我究竟做错了什么?
PS我知道可以确定数组大小并使用简单的"for"构造.我只想弄清楚问题的根源.
PSS好的,如果数组初始化错误 - 怎么做正确?
#include <stdio.h>
#include <stdlib.h>
typedef struct demo
{
int a;
int b;
int c;
} demo;
demo * fieldDefinitions[] =
{
{ 1 , 1, 1 },
{ 2 , 2, 2 },
{ 3 , 3, 3 },
NULL
};
int main()
{
demo ** ptr = fieldDefinitions;
printf( "Array: %d \n", &fieldDefinitions );
while ( *ptr != NULL )
{
printf( "ptr: %d \n", ptr );
printf( "ptr: %d \n", (**ptr).a ); // <--- problem here
ptr++;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如其他人已经指出的那样:听取您的编译器,标准符合要求的实现必须抱怨:
demo * fieldDefinitions[] =
{
{ 1 , 1, 1 }, // <-- note that this is not a pointer to a demo.
{ 2 , 2, 2 },
{ 3 , 3, 3 },
NULL
};
Run Code Online (Sandbox Code Playgroud)
另外,使用p作为printf指针的格式说明符,而不是d(用于整数类型).
您需要指向demo对象的指针,因此需要以某种方式创建这些对象,以便我们可以获取它们的地址.C99添加了一个名为复合文字的功能(看起来有点类似于演员,但是,它们是不同的)创建未命名的对象:
#include <stdio.h>
#include <stdlib.h>
typedef struct demo
{
int a;
int b;
int c;
} demo;
demo * fieldDefinitions[] =
{
&(demo){ 1 , 1, 1 },
&(demo){ 2 , 2, 2 },
&(demo){ 3 , 3, 3 },
NULL
};
int main()
{
demo ** ptr = fieldDefinitions;
printf( "Array: %p \n", (void *)&fieldDefinitions );
for ( ; *ptr != NULL; ptr++ )
{
printf( "ptr: %p\n", (void *)ptr); // I'm not sure, what you really wanted ...
printf( "*ptr: %p\n", (void *)*ptr ); // ... but I think you meant this
printf( "ptr: %d\n", (*ptr)->a ); // or (**ptr).a, whatever you prefer
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通过复合文字创建的对象的生命周期是封闭块或静态的生命周期(如果在初始化程序中用于具有静态存储持续时间的标识符)(如本例所示).
HTH