当我在结构中创建一个char指针时,我可以只为该值指定一个字符串,它可以正常工作。当我尝试使用int数组做类似的事情时,我会收到编译警告,可能是因为我尝试做的事情的语法不正确。在整个程序生命周期中,数据的值将是静态的:
struct structure
{
char *name;
int *data[]; //Likely the issue
};
struct structure value = {
"Some name",
{0, 1} //Error is here
};
每当我尝试初始化值对象时,我会收到一个关于从没有类型转换的整数生成指针的编译错误。我的假设是该值正在指向一个指针,因此我首先要求错误的值。
我的问题是,如何在结构中声明一个int数组,以便我对value对象的声明仍然有效?
答案 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)
你不能只为一个uninitiallized / null指针赋值;你需要使用malloc
为它们分配内存。
只需将其定义为int *data
。