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”(不在函数中) 有什么解释吗 不能基于可变大小定义数组。必须在编译时知道大小。您需要首先创建和第二个指针,并在知道大小后动态分配它们。您不能基于可变大小

我在C中声明了一个正常结构:

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-like
size-(size/2)
用于奇数大小!:-)那么(尺寸+1)/2呢?每个人都有自己的风格:D,但你的风格更有效,你可以从符号表中提取一次尺寸I f