gpt4 book ai didi

c - 具有灵活数组成员的结构数组如何表现?

转载 作者:太空狗 更新时间:2023-10-29 14:58:42 24 4
gpt4 key购买 nike

正如标题所述,我想知道 C 结构数组如何使用 flexible array member表现。这是一个例子:

struct vector {
size_t length;
double array[];
};

维基百科文章说:

The sizeof operator on such a struct is required to give the offset of the flexible array member.

在我的机器上,这对应于 8 个字节 (sizeof(size_t))。但是,当我执行以下操作时会发生什么:

显然数组不能容纳 vector v0 的数据,因为它只有 3*8 字节 = 24 字节 宽。我该如何处理这种情况?

#define LENGTH 10

int main() {
struct vector arr[3];

struct vector *v0 = calloc(1, sizeof(*v0) + LENGTH * sizeof(v0->array[0]));
v0->length = LENGTH;

size_t i;
for (i = 0; i < v0->length; i++) {
v0->array[i] = (double) i;
}

struct vector v1;
struct vector v2;

arr[0] = *v0;
arr[1] = v1;
arr[2] = v2;

for (i = 0; i < arr[0].length; i++) {
printf("arr[0].array[%2zu] equals %2.0lf.\n", i, arr[0].array[i]);
printf(" v0->data[%2zu] equals %2.0lf.\n", i, v0->array[i]);
}
return 0;
}

例如,当我正在编写一个库( header :mylib.h,源代码:my lib.c)并想隐藏一个特定的实现来自用户的结构(在 header 中声明的结构,在源代码中定义 - 隐藏)。不幸的是,这个结构恰好包含一个灵活的数组成员。当用户尝试创建命名结构数组时,这不会导致意外行为吗?

额外:在 OpenSTD C Spec 中阅读有关灵活数组的更多信息.
只需搜索“灵活数组成员”即可。

编辑:C11 标准的最新草案,最新的 C 语言免费引用资料可在此处获得:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

最佳答案

以灵活数组作为最后一个成员的结构不能用作其他结构的成员或数组元素。在此类结构中,不能使用灵活数组,因为它的大小为 0 个元素。 Jonathan Leffler 引用的 C 标准是明确的,尽管使用的语言非常技术化,并且通过搜索 flexible 无法在标准中找到这些段落。

编译器应该为您的结构 vector 数组发出错误。

在您的程序中,您应该改为使用指向struct vectors 的指针数组,每个指针指向一个对象,该对象分配给其灵活数组中适当数量的元素。

修改后的版本:

#include <stdio.h>
#include <stdlib.h>

struct vector {
size_t length;
double array[];
};

struct vector *make_vector(size_t n) {
struct vector *v = malloc(sizeof(*v) + n * sizeof(v->array[0]));
v->length = n;
for (size_t i = 0; i < n; i++) {
v->array[i] = (double)i;
}
return v;
}

int main(void) {
struct vector *arr[3];

arr[0] = make_vector(10);
arr[1] = make_vector(5);
arr[2] = make_vector(20);

for (size_t n = 0; n < 3; n++) {
for (size_t i = 0; i < arr[n]->length; i++) {
printf("arr[%zu]->array[%2zu] equals %2.0lf.\n",
n, i, arr[0]->array[i]);
}
}
return 0;
}

关于c - 具有灵活数组成员的结构数组如何表现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36118536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com