- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
{
char *a, *b;
printf("%lx\n",(b-a));
}
通常有效,事实上,我无法想象它会在 32 位或 64 位机器上发出警告或失败。但对于 ANSI C 和大小感知来说,这是正确的做法吗?我希望这段代码能够在所有可能的平台上运行,包括非 Unix 和嵌入式系统。
最佳答案
b - a
是 ptrdiff_t
,您可以使用 %td
打印在你的printf
格式。来自规范第 6.5.6 节 Additive operators:
When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object; the result is the difference of the subscripts of the two array elements. The size of the result is implementation-defined, and its type (a signed integer type) is
ptrdiff_t
defined in the<stddef.h>
header.
对于 printf
和相关函数,第 7.19.6 节格式化输入/输出函数:
t
Specifies that a followingd
,i
,o
,u
,x
, orX
conversion specifier applies to aptrdiff_t
or the corresponding unsigned integer type argument; or that a followingn
conversion specifier applies to a pointer to aptrdiff_t
argument.
我进一步查看了规范,它似乎表明两个指针的差异甚至可能不适合 ptrdiff_t
。 ,在这种情况下,行为是未定义的:
J.2 Undefined behavior
- The result of subtracting two pointers is not representable in an object of typeptrdiff_t
(6.5.6).
虽然我无法想象可能出现的任何实现。我想你可以查看 PTRDIFF_MIN
和 PTRDIFF_MAX
在<stdint.h>
非常确定。
关于字符 *a, *b; (b-a) 是什么类型,我该如何打印它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1645669/
我是一名优秀的程序员,十分优秀!