c - 如何增加指向具有可变长度数组的结构的指针?

标签 c arrays variables increment

我在访问具有可变大小数组的结构(传递给函数的数组)的指针时遇到问题。

        char name[20];
        char value[20];
   }param_t;
   typedef struct object {
        char name[20];
        int no_of_params;
        param_t params[];
   };

int main()
{
    int no_of_objs = 3, no_of_params = 5;
    object_t *objs = malloc(no_of_objs * (sizeof(object_t) + (no_of_params * sizeof(param_t)) );
     //...
     //...

     objs++;  //Increment to point to the next item <-- Problem: ignores params[] size

     // blah
     // blah
     // blah

我分配了内存以容纳 3 个 object_t,每个 object_t 存储 5 个 param_t。

内存分配很好,我可以为成员设置值。 objs[0] 完全没问题。 现在,如果我增加 objs (objs++) 以指向下一个对象,它实际上指向前一个对象的参数地址。它完全忽略了 params[]。 现在,如果我为第二个 *obj 设置值,它实际上会覆盖前一个 *obj 的 params[]。

我的问题是:这是 C 编译器中的错误吗? 如果没有,我如何遍历对象?

最佳答案

这不是 C 编译器中的错误,只是使用可变长度数组的一个缺点。

编译器可以将struct的可变长度数组成员视为不影响sizeof

这实际上破坏了指针算术,这意味着您不能轻松地“遍历对象”,正如您所说的那样。

我担心这就是生活。这是从 C11 中删除可变长度数组作为强制要求的充分理由。

关于c - 如何增加指向具有可变长度数组的结构的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57909745/

相关文章:

list - 字典的ansible访问列表

JavaScript 常量

c - += 是否返回赋值后左侧的值?

C添加数组元素导致段错误

c# - 清除数组最有效的方法是什么?

javascript - 在 Javascript 中对数据进行分组

Python - 为什么这个类变量没有在方法中定义?

c - 为什么 scanf() 在此代码中导致无限循环?

c - gSOAP 不正确的响应数据

python - 在 python 中解码 RGB 图像的快速方法