c - 遍历空终止数组

标签 c pointers

我想遍历空终止结构数组。 虽然循环工作正常,但是当我尝试访问任何结构字段时,我得到“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/

相关文章:

c++ - C语言的溢出工具是什么?

c++ - 指针立即为 0x0

c++ - 如何引用结构变量并使用或不使用指针进行初始化

将字符串转换为链接列表

c - Pthread 条件变量和无死锁

c - 如何在不安装的情况下使用 kplot(Cairo 绘图库)

c++ - 与 fgetc() 一起使用的整型变量

c++ - 具有不同参数的对象工厂

c - Bitshift 字符数组

c - 有没有办法从 `FILE*` 获取文件名?