C标准允许指向不同类型的指针具有不同的大小,例如sizeof(char*) != sizeof(int*)是允许的.但是,它确实要求如果指针转换为a void*然后转换回其原始类型,则必须将其与原始值进行比较.因此,从逻辑上讲,sizeof(void*) >= sizeof(T*)对于所有类型T,正确吗?
在当今使用的大多数常见平台上(x86,PPC,ARM和64位变体等),所有指针的大小都等于本机寄存器大小(4或8字节),而不管指向的类型.是否存在任何深奥或嵌入式平台,其中指向不同类型的指针可能具有不同的大小?我特别询问数据指针,虽然我也有兴趣知道是否存在函数指针具有异常大小的平台.
我绝对不会问C++的指向成员的指针和指向成员的指针函数.这些在常见平台上具有不寻常的大小,甚至可以在一个平台内变化,具体取决于指针类的属性(非多态,单继承,多继承,虚继承或不完整类型).
它讨论了无法使用void *指针来保存函数指针,因为指向数据的指针和指向函数的指针在某些平台上可能具有不同的大小,并且void *只能保证足够大以保存指向数据的指针.
任何人都可以举一个平台的例子,其中指向数据的指针和指向函数的指针实际上有不同的大小?
这在C++中给出了错误,但在C中没有:
typedef struct nodes
{
int data;
struct node *next;
}node;
Run Code Online (Sandbox Code Playgroud)
它在C++中给出以下错误.
/home/DS cpp/linkedlist.cpp|10|error: conflicting declaration ‘typedef struct nodes node’|
/home/DS cpp/linkedlist.cpp|9|error: ‘struct node’ has a previous declaration as ‘struct node’|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Run Code Online (Sandbox Code Playgroud)
要使它在C++中工作,我必须将其更改为:
typedef struct node
{
int data;
struct node *next;
}node;
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会发生这种情况,我想知道C和C++中的执行顺序,以便我能理解它.