c: 空隙尺寸*

发布于 2024-11-27 13:52:49 字数 336 浏览 0 评论 0原文

我对 C 中的 void* 指针有点困惑。特别是在阅读了这个问题之后: sizeof(somepointer) 总是等于四吗?,有人说不能保证 sizeof(int *) == sizeof(double *)

我的问题是:有保证吗的sizeof(void*) >= sizeof(任何其他指针类型)? 换句话说,我是否可以始终将 some_type* 指针分配给 void* 指针,然后将其作为 some_type* 返回?

I'm a bit confused with a void* pointer in C. Especially after reading this question: Is the sizeof(some pointer) always equal to four?, where one person says there is no guarantee that sizeof(int *) == sizeof(double *)

My question is: is there a guarantee of sizeof(void*) >= sizeof(any other pointer type)?
In other words, can I always assign a some_type* pointer to a void* pointer and then get it back as some_type*?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

且行且努力 2024-12-04 13:52:49

仅数据指针。 void * 可以保存任何数据指针,但不能保存函数指针。

这是C 常见问题解答

void * 只能保证保存对象(即数据)指针;它
不可移植将函数指针转换为 void * 类型。 (在某些
机器,函数地址可以非常大,比任何数据都大
指针。)

对于第一部分,是的,不同类型可以有不同大小的指针 :

Only data pointers. void * can hold any data pointer, but not function pointers.

Here is a C FAQ.

void *'s are only guaranteed to hold object (i.e. data) pointers; it
is not portable to convert a function pointer to type void *. (On some
machines, function addresses can be very large, bigger than any data
pointers.)

As for the first part, yes, different types can have pointers of different sizes:

爺獨霸怡葒院 2024-12-04 13:52:49

指针中存储的值是内存的地址。如果您使用的是 32 位系统,则指向内存的指针将是 32 位(或四个字节)长。如果您使用的是 64 位系统,则指向内存的指针将是 64 位(或八个字节)长。

保存内存中位置的数据大小与内存中该位置表示的数据大小无关。

至于 char *double * 的区别,char * 可以指向任何位置,但 double *< /code> 必须指向八字节边界上的某个内容。较大的数据必须根据您所使用的处理器的规则进行对齐。因此,指向小数据的指针通常与指向大数据的指针不兼容(例如,您不应该将 double * 指针指向 char * 地址);但您可以朝另一个方向前进(例如,您可以将 char * 指针指向 double * 地址)。

The value stored in the pointer is an address to memory. If you're on a 32-bit system, that pointer into memory is going to be 32 bits (or four bytes) long. If you're on a 64-bit system, that pointer into memory is going to be 64 bits (or eight bytes) long.

The size of the data that holds the location in memory has nothing to do with the size of the data represented at that location in memory.

As for how a char * differs from a double *, the char * can point to any location, but the double * has to point to something along an eight-byte boundary. Larger data has to be aligned according to the rules of the processor you're on. So, pointers to small data are not generally compatible with pointers to large data (e.g. you shouldn't point a double * pointer to a char * address); but you're save going in the other direction (e.g. you can point a char * pointer to a double * address).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文