相关疑难解决方法(0)

是否有任何平台指向不同类型的指针有不同的大小?

C标准允许指向不同类型的指针具有不同的大小,例如sizeof(char*) != sizeof(int*)是允许的.但是,它确实要求如果指针转换为a void*然后转换回其原始类型,则必须将其与原始值进行比较.因此,从逻辑上讲,sizeof(void*) >= sizeof(T*)对于所有类型T,正确吗?

在当今使用的大多数常见平台上(x86,PPC,ARM和64位变体等),所有指针的大小都等于本机寄存器大小(4或8字节),而不管指向的类型.是否存在任何深奥或嵌入式平台,其中指向不同类型的指针可能具有不同的大小?我特别询问数据指针,虽然我也有兴趣知道是否存在函数指针具有异常大小的平台.

我绝对不会问C++的指向成员的指针和指向成员的指针函数.这些在常见平台上具有不寻常的大小,甚至可以在一个平台内变化,具体取决于指针类的属性(非多态,单继承,多继承,虚继承或不完整类型).

c pointers sizeof

57
推荐指数
7
解决办法
4909
查看次数

对于所有类型,%p格式说明符都需要显式转换为void*,而printf中的char*

%p在Stack Overflow中已经阅读了很多关于C语言中格式说明符用法的答案,但似乎没有一个解释为什么void*所有类型都需要显式转换为char*.
我当然知道这样一个事实,即强制转换的要求void*与使用可变函数(参见本答案的第一条评论)有关,而非强制性要求.

这是一个例子:

int i;    
printf ("%p", &i);
Run Code Online (Sandbox Code Playgroud)

产生关于类型不兼容性的警告,并且&i应该进行铸造void*(根据标准的要求,再次参见此处).

虽然这一大块代码能够顺利编译,但没有关于类型转换的任何投诉:

char * m = "Hello";    
printf ("%p", m);
Run Code Online (Sandbox Code Playgroud)

如何char*从这一要求中"解脱"?

PS:可能值得补充的是我在 x86_64架构上工作,因为指针类型大小依赖于它,并且使用 gcc作为linux上的-W -Wall -std=c11 -pedantic编译器和编译选项.

c printf types casting void-pointers

17
推荐指数
3
解决办法
1157
查看次数

POSIX对C中指针类型的限制

背景

POSIX标准增加了很多的库函数和其它标识符C语言.在dlsym()功能的描述中,它说(我强调):

概要

#include <dlfcn.h>

void *dlsym(void *restrict handle, const char *restrict name);
Run Code Online (Sandbox Code Playgroud)

描述

对dlsym()函数将获得符号的地址(一个功能标识符或数据对象标识符)...

C标准不保证函数指针可以转换为a void *,甚至不能保证指针的大小相同.这有效地增加了对C类型系统的额外限制.

我的问题是:

  • 对于C类型系统的这种限制是否有规范性参考,或者它只能从某些库函数的描述中推导出来?
  • POSIX甚至可以在一个系统上实现吗? sizeof (function pointer) > sizeof (void *)

参考

c posix function-pointers dlsym

13
推荐指数
1
解决办法
729
查看次数