C 结构内部的变量声明问题
我在C中声明了一个正常结构:C 结构内部的变量声明问题,c,pointers,struct,C,Pointers,Struct,我在C中声明了一个正常结构: typedef struct arr_struct{ int* original; int size; int first[size/2]; int second[size-(size/2)]; }; 编译时,它给了我: test.c:11:错误:此处未声明“size”(不在函数中) 有什么解释吗 不能基于可变大小定义数组。必须在编译时知道大小。您需要首先创建和第二个指针,并在知道大小后动态分配它们。您不能基于可变大小
typedef struct arr_struct{
int* original;
int size;
int first[size/2];
int second[size-(size/2)];
};
编译时,它给了我:
test.c:11:错误:此处未声明“size”(不在函数中)
有什么解释吗 不能基于可变大小定义数组。必须在编译时知道大小。您需要首先创建
和第二个指针,并在知道大小后动态分配它们。您不能基于可变大小定义数组。必须在编译时知道大小。您需要先创建指针
和第二个指针
并在知道大小后动态分配它们
int val;
scanf("%d",&val);
int a[val];
上面的代码实际上是在我的gcc编译器中编译和运行的
不在结构内部工作的原因可能是由于结构内部的元素排列,其大小在编译时无法确定。不过,我不能完全肯定这一点
上面的代码实际上是在我的gcc编译器中编译和运行的
不在结构内部工作的原因可能是由于结构内部的元素排列,其大小在编译时无法确定。不过,我不完全确定。miked所说内容的实现和用法可能是(没有错误检查):
不过,当你完成后,一定要记得free(foo.first)
和free(foo.second)
miked所说内容的实现和用法(无需错误检查):
不过,当你完成后,一定要记得free(foo.first)
和free(foo.second)
为数组提供的大小必须是常量表达式。你有两个选择。一种是包含两个指针,并动态分配空间:
typedef struct {
int* original;
int size;
int *first;
int *second;
} arr_struct;
另一种可能是只使用一个数组,并创建指向其中正确点的指针:
typedef struct {
int* original;
int size;
int *second;
int first[];
} arr_struct;
这使用了一个灵活的数组成员,这是C99的新增功能——如果您使用的是过时的C编译器(例如MS VC++),则可能不直接支持它1。在任何情况下,这仍然需要动态分配,但允许您为所有数据执行一次大型分配,而不是三次单独的分配(一次用于结构,一次用于第一次和第二次)
另外,请注意typedef
的语法——实际上,您的typedef
根本没有定义名称
1不过,解决方法很简单——只需先定义大小为1,然后从分配的大小中减去1即可:
arr_struct *my_struct = malloc(sizeof(*my_struct) + (size-1) * sizeof(int));
从理论上讲,这并不需要工作,但事实上,对于所有真正的编译器,至少对于AFAIK来说,这都是可以的。为数组提供的大小需要是一个常量表达式。你有两个选择。一种是包含两个指针,并动态分配空间:
typedef struct {
int* original;
int size;
int *first;
int *second;
} arr_struct;
另一种可能是只使用一个数组,并创建指向其中正确点的指针:
typedef struct {
int* original;
int size;
int *second;
int first[];
} arr_struct;
这使用了一个灵活的数组成员,这是C99的新增功能——如果您使用的是过时的C编译器(例如MS VC++),则可能不直接支持它1。在任何情况下,这仍然需要动态分配,但允许您为所有数据执行一次大型分配,而不是三次单独的分配(一次用于结构,一次用于第一次和第二次)
另外,请注意typedef
的语法——实际上,您的typedef
根本没有定义名称
1不过,解决方法很简单——只需先定义大小为1,然后从分配的大小中减去1即可:
arr_struct *my_struct = malloc(sizeof(*my_struct) + (size-1) * sizeof(int));
从理论上讲,这并不需要工作,但事实上,对于所有真正的编译器,至少在AFAIK上,这都是正常的。您收到错误消息,因为您试图非法使用结构的大小
成员。首先,结构类型定义直到关闭}
时才完成,因此在此之前编译器不知道结构中有大小
成员。另一方面,您不能引用没有结构实例的结构成员;当您使用表达式size
作为first
和second
的声明符时,编译器正在结构定义之外查找名为size
的变量
在结构类型中使用VLA是可能的,但是如果您正在做我认为您正在做的事情,那么这并不是您想要在这里采用的方法。最好将first
和second
指针指向int
,并根据需要分配它们(如上面的几个答案所示) 您收到错误消息是因为您试图非法使用结构的size
成员。首先,结构类型定义直到关闭}
时才完成,因此在此之前编译器不知道结构中有大小
成员。另一方面,您不能引用没有结构实例的结构成员;当您使用表达式size
作为first
和second
的声明符时,编译器正在结构定义之外查找名为size
的变量
在结构类型中使用VLA是可能的,但是如果您正在做我认为您正在做的事情,那么这并不是您想要在这里采用的方法。最好将first
和second
指针指向int
,并根据需要分配它们(如上面的几个答案所示) 我喜欢尺寸-(尺寸/2)
奇数尺寸!:-)(尺寸+1)/2怎么样?每个人都有自己的风格:D,但你的更有效你从符号表中取一次尺寸,我取两次。不错:PI-likesize-(size/2)
用于奇数大小!:-)那么(尺寸+1)/2呢?每个人都有自己的风格:D,但你的风格更有效,你可以从符号表中提取一次尺寸I f