struct中的变量声明问题

时间:2010-10-15 15:56:46

标签: 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'在这里未声明(不在函数中)

任何解释?

5 个答案:

答案 0 :(得分:4)

您无法根据可变大小定义数组。必须在编译时知道大小。您需要制作firstsecond指针,并在知道size后动态分配它们。

答案 1 :(得分:1)

int val;
scanf("%d",&val);
int a[val];

上面的代码实际上是在我的gcc编译器中编译和运行的。

在结构体内部不工作的原因可能是由于结构中元素的排列,其大小在编译时无法确定。我不是很确定。

答案 2 :(得分:1)

您收到错误消息是因为您尝试非法使用结构的size成员。首先,结构类型定义在结束}之前是不完整的,因此在此之前编译器不知道结构中有size成员。另一方面,如果没有struct实例,则不能引用struct成员;当您使用表达式size firstsecond的声明符时,编译器正在查找结构定义之外的<{1}} 外部的变量。

可以在结构类型中使用VLA,但如果您正在做我认为您正在做的事情,那么这不是您想要采取的方法。最好将sizefirst指针指向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 。在任何情况下,这仍然需要动态分配,但允许您为所有数据进行一次大的分配,而不是三次单独的分配(一个用于结构,一个用于firstsecond)。 / 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。