【问题标题】:C - assigning a true int value to void pointer instead of address/pointer value?C - 将一个真正的 int 值分配给 void 指针而不是地址/指针值?
【发布时间】:2016-04-02 08:39:24
【问题描述】:

我必须处理一个通用链表,所以我不能将数据格式从 void * 转换为 int

微型版:

int main(int argc, char **argv) {
    void *data;
    int i = 100;
    *((int*)data) = i;
    printf("%d", (int)data);
    return 0;
}

继续打印地址。同样,data = &i 也返回一个地址。 data = i 只会导致错误。我已尽我所能,但无法将值 i 插入 data

【问题讨论】:

  • 您不能取消引用“数据” - 它未初始化。鼻恶魔可能会随之而来......
  • GCC 的 / Clang 的 -Wall 选项为什么有用的一个很好的例子:他们会因为你这样做而由衷地扇你一巴掌。

标签: c


【解决方案1】:

你需要先让data指向一个有效的内存地址:

int main(int argc, char **argv) {
    void *data = malloc(sizeof (int));
    int i = 100;
    *((int*)data) = i;
    printf("%d", *((int*)data));
    return 0;
}

如果没有 malloc(),将调用双重未定义行为(访问未初始化的对象 && 将数据写入随机地址)。

另外,在您的 printf() 语句中将 (int)data 更改为 *((int*)data)。如果sizeof (int) > sizeof (void *)data在被施法时会被截断。

【讨论】:

  • 我仍然得到一个返回的地址而不是所需的100 这样做:/
  • @Synlar 试试printf("%d", *((int*)data));
【解决方案2】:

如果您需要使用void * 作为通用容器。

有两个整数或其他数据类型的选项

 void * data = malloc(sizeof(DATATYPE)); // Datatype can be int in this case

然后

 *((int *)data) = SOME VALUE;

然后在某个时候释放它

否则,人们通常可以假设互联网“适合”到 void *。

我不会走这条路。

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2016-08-11
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多