我在C中声明了一个正常结构:
typedef struct arr_struct{
int* original;
int size;
int first[size/2];
int second[size-(size/2)];
};
编译时它给了我:
test.c:11:错误:'size'在这里未声明(不在函数中)
任何解释?
答案 0 :(得分:4)
您无法根据可变大小定义数组。必须在编译时知道大小。您需要制作first
和second
指针,并在知道size
后动态分配它们。
答案 1 :(得分:1)
int val;
scanf("%d",&val);
int a[val];
上面的代码实际上是在我的gcc编译器中编译和运行的。
在结构体内部不工作的原因可能是由于结构中元素的排列,其大小在编译时无法确定。我不是很确定。
答案 2 :(得分:1)
您收到错误消息是因为您尝试非法使用结构的size
成员。首先,结构类型定义在结束}
之前是不完整的,因此在此之前编译器不知道结构中有size
成员。另一方面,如果没有struct实例,则不能引用struct成员;当您使用表达式size
first
和second
的声明符时,编译器正在查找结构定义之外的<{1}} 外部的变量。
可以在结构类型中使用VLA,但如果您正在做我认为您正在做的事情,那么这不是您想要采取的方法。最好将size
和first
指针指向second
并根据需要进行分配(如上面的几个答案所示)。
答案 3 :(得分:0)
miked所说的实现和用法可以是(没有错误检查):
typedef struct
{
int size;
int* first;
int* second;
} arr_struct;
// Prepare an arr_struct for use.
arr_struct foo;
foo.size = 1337;
foo.first = malloc(sizeof(int)*foo.size);
foo.second = malloc(sizeof(int)*(foo.size-foo.size/2));
但是,当你完成时,请记住free(foo.first)
和free(foo.second)
!
答案 4 :(得分:0)
您为数组提供的大小需要是一个常量表达式。你有几个选择。一种是包含几个指针,并动态分配空间:
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 。在任何情况下,这仍然需要动态分配,但允许您为所有数据进行一次大的分配,而不是三次单独的分配(一个用于结构,一个用于first
和second
)。 / p>
arr_struct *my_struct = malloc(sizeof(*my_struct) + size * sizeof(int));
my_struct->second = my_struct->first + size/2;
顺便说一句,请注意typedef
的语法 - 实际上,您的typedef
根本没有定义名称。
1 虽然解决方法很简单 - 只需定义大小为1的first
并在分配中从大小中减去1:
arr_struct *my_struct = malloc(sizeof(*my_struct) + (size-1) * sizeof(int));
从理论上讲,这不是必须的,但实际上它对所有真正的编译器都很好,至少是AFAIK。