使用指针在结构内创建可变长度的int数组

时间:2017-03-05 23:30:33

标签: c arrays pointers integer structure

当我在结构中创建一个char指针时,我可以只为该值指定一个字符串,它可以正常工作。当我尝试使用int数组做类似的事情时,我会收到编译警告,可能是因为我尝试做的事情的语法不正确。在整个程序生命周期中,数据的值将是静态的:

struct structure
{
    char *name;
    int *data[]; //Likely the issue
};

struct structure value = {
    "Some name",
    {0, 1} //Error is here
};

每当我尝试初始化值对象时,我会收到一个关于从没有类型转换的整数生成指针的编译错误。我的假设是该值正在指向一个指针,因此我首先要求错误的值。

我的问题是,如何在结构中声明一个int数组,以便我对value对象的声明仍然有效?

3 个答案:

答案 0 :(得分:2)

你可以写:

struct structure
{
    char *name;
    int *data;
};

struct structure value = {
    "Some name",
    (int[]){0, 1}
};

当然,当你来访问它时,你还需要采用一些其他方法来了解数组中实际有多少int。

请注意,如果此代码出现在函数内部,则int函数将在函数返回时停止存在。 (与字符串文字不同)

答案 1 :(得分:2)

结构中[]的符号是一个灵活的数组成员' (FAM)。您的结构包含类型为int *的FAM,因此数组中的值是指向int的指针。你说你想要一个int数组;这将是int data[];

根据C标准,您无法使用FAM初始化结构的FAM部分。您可以初始化结构的其余部分,但FAM组件将为空,并且无法将FAM组件添加到该结构。

您需要执行以下操作 - 动态分配数组的结构和空间:

struct structure
{
    char   *name;
    size_t  size;
    int     data[];
};

int data[] = { 0, 1 };

struct structure *value = malloc(sizeof(*value) + sizeof(data));

if (value != 0)
{
    value->name = "Some name";
    value->size = sizeof(data) / sizeof(data[0]);
    memcpy(value->data, data, sizeof(data));
    …code using value…
    free(value);
}

我将size成员添加到结构中,因为使用它的代码需要以某种方式知道数组的大小。

以下代码演示了GCC允许初始化FAM,除非您告诉它遵循标准:

#include <stddef.h>

struct structure
{
    char   *name;
    size_t  size;
    int     data[];
};

struct structure value = { "Some name", 2, { 0, 1 } };

GCC(在运行macOS Sierra 10.12.3的Mac上使用6.3.0测试)允许初始化,除非你告诉它是迂腐的:

$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror           -c fam13.c
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -pedantic -c fam13.c
fam13.c:10:44: error: initialization of a flexible array member [-Werror=pedantic]
 struct structure value = { "Some name", 2, { 0, 1 } };
                                            ^
fam13.c:10:44: note: (near initialization for ‘value.data’)
cc1: all warnings being treated as errors
$

它与函数内的变量定义类似。

答案 2 :(得分:1)

  1. 你不能只为一个uninitiallized / null指针赋值;你需要使用malloc为它们分配内存。

  2. 只需将其定义为int *data