【发布时间】:2018-05-20 20:00:07
【问题描述】:
语言:C
我正在尝试在结构中声明和初始化一个数组并将其传递给一个指针,该指针本身在结构 xD 中声明
是的,我知道我的尝试是......让我们说“不正确”:D 但如果存在类似的东西,那将非常有用。
有什么想法吗?
struct structname {
int* section_A;
int* section_B;
};
static const struct structname structvariable_a = {
.section_A = (int[]) {
[0x01] = 1,
[0x02] = 2,
[0x03] = 3
},
.section_B = (int[]) {
[0x33] = 4,
[0x34] = 5
},
};
static const struct structname structvariable_b = {
.section_A = (int[]) {
[0x01] = 10,
[0x02] = 20,
[0x03] = 30
},
.section_B = (int[]) {
[0x33] = 7,
[0x34] = 8
},
};
稍后,我想访问这些值...
int main()
{
struct structname* structvariablepointer;
if(foo == 1){
structvariablepointer = &structvariable_a;
} else {
structvariablepointer = &structvariable_b;
}
printf("%i", ARRAY_SIZE(structvariablepointer->section_A)); // ARRAY_SIZE(arr) equals sizeof(arr) / sizeof(arr[0]));
int b = 2;
printf("%i", structvariablepointer->section_A[b]);
}
唯一的错误是
./include/linux/build_bug.h:29:45: Fehler: Negative Breite in Bitfeld »<anonym>«
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:(-!!(e)); }))
^
./include/linux/compiler-gcc.h:64:28: Anmerkung: bei Substitution des Makros »BUILD_BUG_ON_ZERO«
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
^~~~~~~~~~~~~~~~~
./include/linux/kernel.h:60:59: Anmerkung: bei Substitution des Makros »__must_be_array«
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
^~~~~~~~~~~~~~~
【问题讨论】:
-
@user-44651 - 您引用的链接标记为 c#,这是一种完全不同的语言,具有不同的规则。 IMO,这不是那个的副本。
-
在您为
int* section_A;创建空间之前,您在static const struct structname structvariable_b = {...中引用的元素不存在。如果您知道在编译时会有三个元素,为什么不直接将其创建为:int section_A[3];?一般来说,最好使用堆栈内存,除非直到运行时才能知道某物的大小。 -
我将删除这个问题,因为没有人支持它 - 因此我不能再问什么了...我有人反对删除,请告诉我。
标签: c arrays struct initialization declaration