【发布时间】:2020-02-11 07:13:12
【问题描述】:
在 C 语言中说,当指针指向同一个数组或该数组末尾的一个元素时,算术和比较是明确定义的。那么在数组的第一个元素之前呢?只要我不取消引用就可以吗?
给定
int a[10], *p;
p = a;
(1) 写--p合法吗?
(2) 在表达式中写p-1是否合法?
(3) 如果(2) 没问题,我可以断言p-1 < a 吗?
对此存在一些实际问题。考虑一个 reverse() 函数,它反转以 '\0' 结尾的 C 字符串。
#include <stdio.h>
void reverse(char *p)
{
char *b, t;
b = p;
while (*p != '\0')
p++;
if (p == b) /* Do I really need */
return; /* these two lines? */
for (p--; b < p; b++, p--)
t = *b, *b = *p, *p = t;
}
int main(void)
{
char a[] = "Hello";
reverse(a);
printf("%s\n", a);
return 0;
}
我真的需要检查代码吗?
请从语言律师/实践的角度分享您的想法,以及您将如何应对这种情况。
【问题讨论】:
-
(1) 写它可能是合法的,但如果你执行它,结果是未定义的行为。使用分段架构(英特尔 80286、80386 等),结果可能完全令人困惑。 (2) 同上。 (3) N/A,但答案是否定的。对于您的硬件和操作系统,您可能很安全,但 C 标准并不能保证这一点。
标签: c language-lawyer pointer-arithmetic