C编程:将int指针转换为int?

Tim*_*Tim 19 c pointers void

假设我有一个名为ptr的void*.我应该如何使用ptr存储int?写作是否足够

ptr = (void *)5;
Run Code Online (Sandbox Code Playgroud)

如果我想保存5号?或者我必须使用malloc来保存它?

Bri*_*ach 35

你正在构建5一个无效指针并将其分配给ptr.

现在ptr指向内存地址0x5

如果这实际上是你想要做的......好吧,是的,这是有效的.你...可能不想这样做.

当你说"存储一个int"我猜你的意思是你想要将整数值5存储在指向的内存中void*.只要有足够的内存分配(sizeof(int))你就可以通过强制转换来实现...

void *ptr = malloc(sizeof(int));
*((int*)ptr) = 5;

printf("%d\n",*((int*)ptr));
Run Code Online (Sandbox Code Playgroud)

  • 我一直这样做,当使用一个框架将"用户数据"存储为"void*"时,我只需要一个int. (8认同)

Boa*_*ann 6

这将适用于所有平台/环境sizeof(void*) >= sizeof(int),这可能是其中的大多数,但我认为并非全部。你不应该依赖它。

如果可以,您应该改用联合:

union {
    void *ptr;
    int i;
};
Run Code Online (Sandbox Code Playgroud)

然后,您可以确保有适合任何类型数据的空间,并且您不需要强制转换。(只是不要尝试在指针中有非指针数据时取消引用指针。)

或者,如果您这样做的原因是您使用 int 来存储地址,则应改为使用它,以便它足够大以保存任何平台上的任何指针值。size_t intptr_t

  • 不,不要使用 `size_t`。不能保证能够保存所有可能的指针地址。自 C99 以来,`intptr_t` 和 `uintptr_t` 就在那里。在 C90 中,你不走运。我什至可以给你一个平台,其中 `size_t` 是 16 位宽,指针是 32 位宽:x86 在实模式下使用内存模型 `HUGE`、`FAR` 和 `COMPACT`。`size_t` 可以看作是用于寻址数组的类型,仅此而已。 (3认同)