相关疑难解决方法(0)

正确的格式说明符打印指针或地址?

我应该使用哪种格式说明符来打印变量的地址?下面很多我很困惑.

%u - 无符号整数

%x - 十六进制值

%p - 无效指针

哪个是打印地址的最佳格式?

c format pointers memory-address

167
推荐指数
5
解决办法
25万
查看次数

标准委员会关心的异域架构

我知道C和C++标准留下了语言实现的许多方面 - 仅仅因为如果存在具有其他特征的体系结构,那么为它编写符合标准的编译器是非常困难或不可能的.

我知道40年前任何电脑都有自己独特的规格.但是,我不知道今天使用的任何架构:

  • CHAR_BIT != 8
  • signed 不是两个补充(我听说Java有这个问题).
  • 浮点不符合IEEE 754(编辑:我的意思是"不是IEEE 754二进制编码").

我问的原因是我经常向人们解释C++不强制要求任何其他低级方面如固定大小的类型.这很好,因为与其他语言不同,它使你的代码在正确使用时可以移植(编辑:因为它可以移植到更多架构而不需要模拟机器的低级方面,例如符号+幅度架构上的二进制补码算法) .但我感到很难过,我自己也无法指出任何特定的架构.

所以问题是:哪些架构具有上述属性?

uint*_ts是可选的.

c c++ architecture

149
推荐指数
7
解决办法
1万
查看次数

所有指针都是从指向结构类型的指针派生的吗?

问题

是否所有指针都是从指向结构类型的指针派生的问题都不容易回答.我发现这是一个重要问题,主要有以下两个原因.

A.缺少指向"任何"不完整或对象类型的指针,对方便的函数接口施加了限制,例如:

int allocate(ANY_TYPE  **p,
             size_t    s);

int main(void)
{
    int *p;
    int r = allocate(&p, sizeof *p);
}
Run Code Online (Sandbox Code Playgroud)

[ 完整代码示例 ]

指向"任何"不完整或对象类型的现有指针明确描述为:

C99/ C11 §6.3.2.3 p1:

指向void的指针可以转换为指向任何不完整或对象类型的指针.[...]

从指向"任何"不完整或对象类型的现有指针派生的指针,指向void的指针,严格地是指向void的指针,并且不需要使用从指向"任何"不完整的指针派生的指针进行转换或对象类型.


B.程序员根据他们对特定实现的经验,使用基于不需要的假设的约定,有意识地或不知不觉地与指针的泛化相关,这种情况并不少见.假设,例如可转换,可表示为整数或共享公共属性:对象大小,表示或对齐.


标准的话

根据C99 §6.2.5 p27/ C11 §6.2.5 p28:

[...]所有指向结构类型的指针应具有相同的表示和对齐要求.[...]

其次是C99 TC3 Footnote 39/ C11 Footnote 48:

相同的表示和对齐要求意味着可互换性作为函数的参数,函数的返回值和联合的成员.

虽然标准没有说:"指向结构类型的指针"并且选择了以下单词:"所有指向结构类型的指针",但它没有明确指定它是否适用于这种指针的递归推导.在标准中提到指针的特殊属性的其他情况下,它没有明确指定或提及递归指针派生,这意味着"类型派生"适用,或者它没有 - 但它没有明确提到.

虽然在引用类型时使用"所有指针"的措辞使用两次,(对于结构和联合类型),而不是更明确的措辞:在整个标准中使用的"指针",我们不能总结它是否适用于这种指针的递归推导.

c struct pointers c99 strict-aliasing

28
推荐指数
1
解决办法
812
查看次数

void*将具有与char指针相同的表示和内存对齐方式

我正在读一本关于" 理解和使用c指针 "的指针的书

说到void *它说

它有两个有趣的属性:

  1. 指向void的指针将具有与指向char的指针相同的表示和内存对齐.

令人困惑的是,所有指针的记忆都不一样吗?他们为什么而不是写void*与它明确提到的char指针的普通指针相同?真的很感激任何帮助

c pointers memory-alignment

4
推荐指数
1
解决办法
957
查看次数