C标准允许指向不同类型的指针具有不同的大小,例如sizeof(char*) != sizeof(int*)是允许的.但是,它确实要求如果指针转换为a void*然后转换回其原始类型,则必须将其与原始值进行比较.因此,从逻辑上讲,sizeof(void*) >= sizeof(T*)对于所有类型T,正确吗?
在当今使用的大多数常见平台上(x86,PPC,ARM和64位变体等),所有指针的大小都等于本机寄存器大小(4或8字节),而不管指向的类型.是否存在任何深奥或嵌入式平台,其中指向不同类型的指针可能具有不同的大小?我特别询问数据指针,虽然我也有兴趣知道是否存在函数指针具有异常大小的平台.
我绝对不会问C++的指向成员的指针和指向成员的指针函数.这些在常见平台上具有不寻常的大小,甚至可以在一个平台内变化,具体取决于指针类的属性(非多态,单继承,多继承,虚继承或不完整类型).
C 标准规定:
指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。类似地,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针都应具有相同的表示和对齐要求。所有指向联合类型的指针都应具有相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。
即sizeof(int*)不一定等于sizeof(char*)- 但sizeof(struct A*)一定等于sizeof(struct B*)。
这个要求背后的原理是什么?据我了解,基本类型不同大小背后的基本原理 是支持近/远/巨大指针等用例(编辑:正如评论和接受的答案中指出的那样,这不是基本原理) - 但不是这个相同的原理适用struct于内存中不同位置的 s 吗?
它讨论了无法使用void *指针来保存函数指针,因为指向数据的指针和指向函数的指针在某些平台上可能具有不同的大小,并且void *只能保证足够大以保存指向数据的指针.
任何人都可以举一个平台的例子,其中指向数据的指针和指向函数的指针实际上有不同的大小?
void *是一个通用指针,但是呢void **?是void **也一个通用的指针?
我们可以强制转换void **到int **,char **等等.
我会感谢堆栈溢出系列的任何信息.
通过在普通台式PC上运行简单的C ++程序进行基本测试,似乎可以假设任何类型的指针(包括函数指针)的大小等于目标体系结构位的大小。
例如:在32位体系结构中-> 4个字节,在64位体系结构中-> 8个字节。
但是我记得读过的话,它不是一般的那样!
所以我想知道这种情况会怎样?
我读这个帖子这是关系到char和byte,并遇到了下面的话:
一个
int*仍然可以被实现为单个硬件指针,因为C++允许sizeof(char*) != sizeof(int*).
如何理解'C++允许sizeof(char*) != sizeof(int*)'?
我想从二进制表示中生成浮点变量,我很快就想出了以下代码:
float bintofloat(unsigned int x) {
float *f = (float *)&x;
return *f;
}
Run Code Online (Sandbox Code Playgroud)
然后可以按如下方式调用上述函数:
float f = bintofloat(0x3f800000);
Run Code Online (Sandbox Code Playgroud)
我只是希望得到一些关于这种方法的意见:使用指针是否是最好的方法,或者是否有更好或更简洁的方法?
不幸的是,我对类型的使用似乎造成了干扰。对此我深表歉意;为了简单起见,我选择坚持使用内置类型。但我确实认识到这是天真的,并假设sizeof(int) == sizeof(float)。
同样,我的主要问题是使用指针是否是实现从二进制到浮点转换的好方法?
我一直在浏览一些帖子,并注意到指针可以根据sizeof代码编译和运行的体系结构而有不同的大小.对我来说似乎足够合理(即:32位架构上的4字节指针,64位上的8字节,完全有意义).
让我感到惊讶的一件事是指针的大小可以根据它指向的数据类型而有所不同.我认为,在32位体系结构中,所有指针的大小都是4个字节,但事实证明,函数指针可以是不同的大小(即:大于我预期的大小).为什么这是C编程语言?我找到了一篇文章解释了这个C++,以及程序如何处理虚函数,但这似乎不适用于纯C.此外,似乎使用"远"和"近"指针是不再需要,所以我没有看到那些进入等式的人.
那么,在C中,什么理由,标准或文档描述了为什么不是所有指针在同一架构上都是相同的大小?
谢谢!
这是我的第一篇文章.我对C的指针及其与struct的关系非常困惑.我搜索了更多信息,但无法真正得出结论.例如,给定此结构定义
typedef struct node
{
int info;
struct node *next;
}NODE;
Run Code Online (Sandbox Code Playgroud)
那么这四个宣言的差异和影响是什么呢?
1. NODE *node1 = malloc (sizeof(NODE));
2. NODE *node1 = (struct node *) malloc (sizeof(NODE));
3. NODE *node1 = (struct node *) malloc (sizeof(NODE *));
4. NODE *node1 = malloc (sizeof(NODE *));
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我需要函数指针的帮助.
我有两个函数指针类型:
typedef void (*draw_func1_t)(void* data, void* painter, double x, double y);
typedef void (*draw_func2_t)(void* data, MyPainter* painter, double x, double y);
Run Code Online (Sandbox Code Playgroud)
除第二个参数外,这两种类型几乎相同.现在我需要编写一个将draw_func1_t转换为draw_func2_t的函数:
draw_func2_t convert_func_p(draw_func1_t func) { ... }
Run Code Online (Sandbox Code Playgroud)
我怎么写呢?我可以强迫演员像
return (draw_func2_t)func;
Run Code Online (Sandbox Code Playgroud)
因为这两个函数原型是二进制兼容的?
我正在做一些C++工作,需要我将"普通"(广泛使用)数据类型转换为int固定大小的对应点,例如std::int32_t.void*但是,我有一些使用的代码,这给我带来了麻烦.
我知道任何给定指针的大小在给定系统上是相同的 - 为未来的读者编辑:有人指出,指针的大小,绝对或相对性都没有保证.sizeof(void*) == sizeof(int*) == sizeof(short*) == sizeof(long*).但我也知道指针的大小可能因系统而异(特别是32位与64位).
是否有固定尺寸类型能够持有void*?我认为std::intptr_t或是std::uintptr_t潜在的候选人,但我不确定哪一个(如果有的话)是正确的.这主要是由于签字; 我不确定为什么有签名和无符号形式intptr_t,因为我没有印象中指针的签名可以控制.Instinct说我想要使用,uintptr_t因为我不相信指针可以签名,但那么它有什么intptr_t用?
关于我的需求的更多信息:我正在研究DLL,并且如果可能的话需要保证交叉编译器功能.对于基于整数的类型,这不是太糟糕; 我能够将它们转换为std::intXX_t幕后类型.但我的DLL函数之一做了一些原始的内存操作,需要返回一个void*.我很担心这导致我各种各样的麻烦,如果我不能正确地包装它,但我不知道是什么把它包起来用:我已经无法找到任何形式的有关大小或数据的保证指针范围.我知道内存本身可以在DLL外部访问; 这不是问题.但确保一个void*可以从主机EXE到我的DLL,或反之亦然,安全是一个更大的问题.