gpt4 book ai didi

arrays - 使用灵活数组成员延迟指向结构的指针不是 "copy"FAM?

转载 作者:行者123 更新时间:2023-12-01 23:19:17 25 4
gpt4 key购买 nike

指针引用到具有灵活数组成员 (FAM) 的结构 不会“复制”FAM?

根据这个程序,这似乎是行为,它创建一个带有 FAM 的结构实例,然后检查指向该结构的指针和该结构的取消引用的“二进制布局”。

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

int main(){

typedef struct{
uint8_t idim;
uint32_t data[];
}array_t; // https://gustedt.wordpress.com/2011/03/14/flexible-array-member/

int64_t x_bdim = sizeof(array_t) + sizeof(uint32_t)*0x2;
array_t* _x = aligned_alloc(0x1000,x_bdim);
array_t x = *_x;
uint8_t* raw;

x.idim = 0xff;
x.data[0x0] = 0x11111111;
x.data[0x1] = 0x22222222;

_x->idim = 0xff;
_x->data[0x0] = 0x11111111;
_x->data[0x1] = 0x22222222;

printf("%'ld %'ld %'ld\n", sizeof(array_t), sizeof(array_t) + sizeof(uint32_t)*0x2, x_bdim);

putchar(0x0a);
raw = (uint8_t*)_x;
for(int i=0; i<x_bdim; ++i)
printf("%02x\n", raw[i]);

putchar(0x0a);
for(int i=0; i<0x2; ++i)
printf("%08x\n", _x->data[i]);

putchar(0x0a);
raw = (uint8_t*)&x;
for(int i=0; i<x_bdim; ++i)
printf("%02x\n", raw[i]);

putchar(0x0a);
for(int i=0; i<0x2; ++i)
printf("%08x\n", x.data[i]);
}

我是不是遗漏了什么,或者这是正确的吗?故事的主旨是我们不应该使用灵活的数组成员来尊重(指向)结构,因为我们只得到结构的“头”而不是完整的数组数据吗?

最佳答案

那是对的。编译器不知道数组的大小,并假定此类操作为 0,包括复制、返回、分配和比较。实际上,灵活数组位于结构之后。

GCC 的原型(prototype)语法更加明显。他们把它写成 uint32_t data[0];

关于arrays - 使用灵活数组成员延迟指向结构的指针不是 "copy"FAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68317822/

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