c - 如何在 C 中的结构中包含动态数组?

标签 c pointers arrays struct memory-management

我环顾四周,但未能找到解决这个问题的好方法。 这是我的代码:

 #include <stdlib.h>

struct my_struct {
    int n;
    char s[]
};

int main()
{
    struct my_struct ms;
    ms.s = malloc(sizeof(char*)*50);
}

这是 gcc 给我的错误: 错误:灵活数组成员的使用无效

如果我在结构中声明 s 的声明,我可以让它编译

char* s

这可能是一个更好的实现(指针算法比数组快,是吗?) 但我想在 c 中声明

char s[]

相同
char* s

最佳答案

你现在的写法,过去被称为“struct hack”,直到 C99 将其称为“灵活的数组成员”。你得到一个错误的原因(可能无论如何)是它需要跟一个分号:

#include <stdlib.h>

struct my_struct {
    int n;
    char s[];
};

当你为此分配空间时,你想要分配结构的大小加上你想要的数组空间量:

struct my_struct *s = malloc(sizeof(struct my_struct) + 50);

在这种情况下,灵活数组成员是一个 char 数组,并且 sizeof(char)==1,因此您不需要乘以它的大小,但就像您需要的任何其他 malloc 一样它是一些其他类型的数组:

struct dyn_array { 
    int size;
    int data[];
};

struct dyn_array* my_array = malloc(sizeof(struct dyn_array) + 100 * sizeof(int));

编辑:将成员更改为指针会产生不同的结果。在这种情况下,您(通常)需要两个单独的分配,一个用于结构本身,一个用于指针指向的“额外”数据。使用灵活的数组成员,您可以在单个 block 中分配所有数据。

关于c - 如何在 C 中的结构中包含动态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2060974/

相关文章:

c - 使用 "="为内部的 char 数组分配结构有效吗?

c - pinsrd/_mm_insert_epi32 与字节指针对齐?

c++ - 关于从结构指针读取的代码的简单代码

c - 进程之间共享线程?

c - 分配给结构的不兼容指针类型

c - 重新分配字符串文字

javascript - 使用 Angular js 迭代数组并将值存储为对象的键和值

delphi - 多维动态数组中需要完成什么?

c - 函数指针模拟方法在 C 中有害吗?

C 程序练习。简单的交易报告