C数组的虚空指针持有不同的值类型。

问题描述 投票:0回答:1

我想让一个有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包括铸造,但没有任何效果。

我应该如何处理?

c arrays pointers void-pointers
1个回答
2
投票

首先

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

2
投票
void *ptrs[numOfArgs]= {arg1,arg2,arg3};

当你编译你的代码时,你可以得到错误:

可变大小的对象可能没有被初始化

如果你想用这种方式声明数组,你必须将常量变量 numOfArgs#define:

#define numOfArgs 3

或者你可以将数组中的每个元素的指针初始化为。

    void *ptrs[numOfArgs];
    ptrs[0] = &v1;
    ptrs[1] = &v2;
    ptrs[2] = &v3;

2
投票

这一行的问题是:

void *ptrs[numOfArgs]= {arg1,arg2,arg3};

这一行的问题是 ptrs 是一个 变长数组. 这种数组不允许被初始化,因为它的大小是在运行时决定的。 这并不重要,因为 numOfArgs 被宣布为 const.

如果一个数组的大小是一个编译时常数,或者更正式的说是一个 常量词. 如果大小是一个宏,你可以满足这个要求。

#define numOfArgs 3
© www.soinside.com 2019 - 2024. All rights reserved.