我想遍历空终止结构数组。 虽然循环工作正常,但是当我尝试访问任何结构字段时,我得到“segfault”作为响应。我做错了什么?
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;
}
最佳答案
正如其他人已经指出的那样:听听您的编译器,符合标准的实现必须提示:
demo * fieldDefinitions[] =
{
{ 1 , 1, 1 }, // <-- note that this is not a pointer to a demo.
{ 2 , 2, 2 },
{ 3 , 3, 3 },
NULL
};
此外,使用 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;
}
通过复合字面量创建的对象的生命周期是封闭 block 的生命周期,如果在具有静态存储持续时间的标识符的初始化程序中使用(如本例所示),则为静态的。
HTH
关于c - 遍历空终止数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24552972/