【问题标题】:c, assigning value pointed to by void * to void * arrayc、将void *指向的值赋给void *数组
【发布时间】:2012-03-01 02:36:55
【问题描述】:

我正在尝试在 void * 数组中分配由 void * 指向的值。这是我到目前为止所拥有的:

23 void queue_enqueue(void *q, void *item) {
24 int len = 0 ;
25 
26 len = sizeof(q) ;
27 q[len-1] = 
28     item ;
29     
30 return ;
31 
32 }

出现此编译器错误:

myqueue.c:27: warning: dereferencing ‘void *’ pointer
myqueue.c:28: error: invalid use of void expression

我一直在寻找答案大约一个小时,但我还没有看到与我在这里给出的类似的实现。如果您想知道,是的,这是家庭作业,原型是由讲师提供的。

因为它们是作为 void * 传递的,所以我一直无法使用 gcc typeof 运算符。

我同意这个警告。我知道这只是 gcc 告诉我“小心我们不会为你检查这个”,但我无法摆脱第 28 行的错误。

提前感谢您的帮助。

【问题讨论】:

  • 出于好奇,你为什么要这样做?
  • 你知道sizeof给你的是指针的大小,而不是数组中元素的数量吗?
  • @Calvin - 我正在创建一个队列并消除数据冗余,我允许它保存任何数据类型
  • @asaeir - 你完全正确。您刚刚为我节省了一些时间来尝试追踪该错误。

标签: c void-pointers


【解决方案1】:

这不是void*s 的数组,它是void 的数组(实际上并不存在),取消引用它会得到一个void,它“不是真正的类型”,所以你无法分配给它。

如果您尝试使用 void* 数组,请将其更改为

void queue_enqueue(void** q, void* item)

void queue_enqueue(void* q[], void* item) // same as above

也意识到你的程序会做

q[sizeof(void**) - 1] = item;

每次。 sizeof 为您提供指针类型的大小,而不是数组。如果您想知道数组的长度,则必须将数组的长度作为单独的参数传递。

【讨论】:

  • 使用时:char * c ; c = malloc(10) ;您可以访问单个元素。我这样创建: void * myqueue ; myqueue = (void **)malloc( n ) ;并认为我可以像使用数组一样访问每个单独的元素。教授给了我们以下 .h 文件(我们必须使用): void *queue_new(int numItems); void queue_enqueue(void *q, void *item);无效 *queue_dequeue(无效 *q); int queue_isEmpty(void *q);
  • @user1042739 这些确实是可疑的函数原型;例如,你应该怎么知道一个队列是否只有一个指针是空的?我想请你的教授了解更多关于这应该如何工作的细节。此外,你不能做(void**)malloc(n),因为这使它成为指向void 的指针的指针,如果它们是例如,这将搞砸你的数据。 chars.
【解决方案2】:

你需要一个void*的数组:

void queue_enqueue(void *q[], void *item)

【讨论】:

    【解决方案3】:

    void 是没有大小的类型。 因此不能存在空数组。 (因为数组定义了单位的数量,然后使用 sizeof() 运算符进行跳转。

    您必须将 void* 转换为某物*,某物的大小与您实际存储在那里的大小相同,因此假设您有类型 T,它的大小相同(我不是说同样的东西),

    T* q2 = (T*)q;
    T* item2 = (T*)item;
    q2[len-1] = &item;
    

    这会起作用,因为 C 通过引用传递指针。
    因为 T 将是一个真正的类型,所以编译器允许你这样做
    由于 T 的大小与您实际存储的值相同,因此您最终会得到正确的值存储位置。

    注意 void* 作为一个数组,将包含一个指向 void 类型数组的指针。 void* 作为单个值将包含单个 void 值。

    【讨论】:

    • 另外,对于长度,使用:len = sizeof(&q)/sizeof(T);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 2018-04-19
    • 2014-11-03
    相关资源
    最近更新 更多