我想让一个有3个指针的void数组。
char v1='c';
int v2 =12;
int const numOfArgs=3;
char v3[3] = "geo";
void *arg1 = &v1;
void *arg2 = &v2;
void *arg3 = &v3;
void *ptrs[numOfArgs]= {arg1,arg2,arg3};
我尝试了几种方法来使用其中的一个指针 ptrs
包括铸造,但没有任何效果。
我应该如何处理?
首先
char v3[3] = "geo";
没有足够的空间来附加 '\0'
(C字串是空尾的)。
所以改成
char v3[4] = "geo";
为了从 void *ptrs[numOfArgs]
, 浇铸 将工作。不要忘了 提述 在需要的时候。
下面是一个例子。
printf("\n%c", *(char*)ptrs[0]);
printf("\n%d", *(int*)ptrs[1]);
printf("\n%s", (char**)ptrs[2]);
输出:
c
12
geo
void *ptrs[numOfArgs]= {arg1,arg2,arg3};
当你编译你的代码时,你可以得到错误:
可变大小的对象可能没有被初始化
如果你想用这种方式声明数组,你必须将常量变量 numOfArgs
由 #define
:
#define numOfArgs 3
或者你可以将数组中的每个元素的指针初始化为。
void *ptrs[numOfArgs];
ptrs[0] = &v1;
ptrs[1] = &v2;
ptrs[2] = &v3;
这一行的问题是:
void *ptrs[numOfArgs]= {arg1,arg2,arg3};
这一行的问题是 ptrs
是一个 变长数组. 这种数组不允许被初始化,因为它的大小是在运行时决定的。 这并不重要,因为 numOfArgs
被宣布为 const
.
如果一个数组的大小是一个编译时常数,或者更正式的说是一个 常量词. 如果大小是一个宏,你可以满足这个要求。
#define numOfArgs 3