gpt4 book ai didi

c - 如何在不破坏严格别名的情况下在一个 malloc 调用中为数组和结构分配内存?

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

为可变大小的数组分配内存时,我经常这样做:

struct array {
long length;
int *mem;
};

struct array *alloc_array( long length)
{
struct array *arr = malloc( sizeof(struct array) + sizeof(int)*length);
arr->length = length;
arr->mem = (int *)(arr + 1); /* dubious pointer manipulation */
return arr;
}

然后我像这样使用数组:

int main()
{
struct array *arr = alloc_array( 10);
for( int i = 0; i < 10; i++)
arr->mem[i] = i;
/* do something more meaningful */
free( arr);
return 0;
}

这可以在没有警告的情况下运行和编译。然而最近,我读到了关于严格别名的内容。据我了解,上面的代码在严格别名方面是合法的,因为内存是通过 int * 访问的。不是通过 struct array * 访问的内存.代码实际上是否违反了严格的别名规则?如果是这样,如何修改才能不破坏它们?

我知道我可以单独分配结构和数组,但是我也需要单独释放它们,大概是在某种 free_array 中功能。这意味着我在释放内存时必须知道要释放的内存类型,这会使代码复杂化。它也可能会更慢。这不是我要找的。

最佳答案

在结构中声明灵活数组成员的正确方法如下:

struct array {
long length;
int mem[];
};

然后您可以像以前一样分配空间,而不必为 mem 分配任何内容:

struct array *alloc_array( long length)
{
struct array *arr = malloc( sizeof(struct array) + sizeof(int)*length);
arr->length = length;
return arr;
}

关于c - 如何在不破坏严格别名的情况下在一个 malloc 调用中为数组和结构分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48714298/

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