gpt4 book ai didi

c - 取消引用指向 void 数组的指针

转载 作者:行者123 更新时间:2023-12-04 06:18:18 24 4
gpt4 key购买 nike

我正在尝试更多地了解 C 及其神秘的隐藏功能,并尝试制作一个包含指向 void 的指针的示例结构,旨在用作数组。
编辑:重要说明:这是原始 C 代码。

假设我有这个结构。

    typedef struct mystruct {
unsigned char foo;
unsigned int max;
enum data_t type;
void* data;

} mystruct;

我希望数据可以容纳最大的无符号字符、无符号短整数和无符号长整数,data_t 枚举包含
这 3 种情况的值。
    enum Grid_t {gi8, gi16, gi32}; //For 8, 16 and 32 bit uints.

然后我有这个函数来初始化和分配这个结构之一,并且应该返回一个指向新结构的指针。
    mystruct* new(unsigned char foo, unsigned int bar, long value) {
mystruct* new;
new = malloc(sizeof(mystruct)); //Allocate space for the struct.
assert(new != NULL);
new->foo = foo;
new->max = bar;
int i;
switch(type){
case gi8: default:
new->data = (unsigned char *)calloc(new->max, sizeof(unsigned char));
assert(new->data != NULL);
for(i = 0; i < new->max; i++){
*((unsigned char*)new->data + i) = (unsigned char)value;
//Can I do anything with the format new->data[n]? I can't seem
//to use the [] shortcut to point to members in this case!
}
break;
}
return new;
}

编译器不返回任何警告,但我对这种方法不太确定。这是使用指针的合法方式吗?

有没有更好的方法©?

我错过了打电话。像 mystruct* P; P = 新(0,50,1024);

union 很有趣,但不是我想要的。由于无论如何我都必须单独处理每个特定案例,因此类型转换似乎与 union 一样好。我特别希望拥有比 32 位数组大得多的 8 位数组,因此 union 似乎无济于事。为此,我将使它只是一个长数组:P

最佳答案

type应该是函数的参数? (不要命名这个函数或任何变量 new 或任何试图使用它的 C++ 程序员会追捕你)

如果要使用数组索引,可以使用这样的临时指针:

unsigned char *cdata = (unsigned char *)new->data;
cdata[i] = value;

我真的不认为你的方法有问题。如果您期望特定尺寸(我认为您确实给出了名称 gi8 等),我建议包括 stdint.h并使用 typedef uint8_t , uint16_t , 和 uint32_t .

关于c - 取消引用指向 void 数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6947310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com