C 这个指针超出范围了吗?
作为练习,我创建了以下程序:C 这个指针超出范围了吗?,c,pointers,C,Pointers,作为练习,我创建了以下程序: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX 100 int main(void) { char message[MAX]; char *p = message; char *q = message; char c = ' '; printf("Enter a message: ");
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX 100
int main(void)
{
char message[MAX];
char *p = message;
char *q = message;
char c = ' ';
printf("Enter a message: ");
while((c = toupper(getchar())) != '\n' && (p < message + MAX)) {
if(isalpha(c))
*p++ = c;
}
p--;
while(*p == *q) {
if((p == q) || (p == q - 1) || (p - 1 == q)) {
printf("Palindrome\n");
exit(0);
}
q++;
p--;
}
printf("Not a palindrome\n");
return 0;
}
#包括
#包括
#包括
#定义最大值100
内部主(空)
{
字符消息[MAX];
char*p=消息;
char*q=消息;
字符c='';
printf(“输入消息:”);
而((c=toupper(getchar())!='\n'&&(p
这是否是一个问题/漏洞,即在第一个while
循环中,当最后一次输入时,p
指向消息[100]
数组之外
我在下面减少了它,但我想知道这样做是否被认为是一种不好的做法
这是一个问题/漏洞吗
没有
只要在while循环之后减小它之前不取消引用它。否则,它将超出范围。C标准允许并定义将
p
设置为指向消息
数组之外的一个元素(根据下面引用的标准中的文本)
当用户输入空行时,p--
的行为不由C标准定义
当用户输入一个空行时,第一个while
循环将不会执行任何迭代,p
将保留其初始值,由消息设置
然后p--
递减p
,使其指向消息之外
C语言中的指针不仅仅是作为地址的数字;C标准没有为它们定义任意算法。后缀的C规范--
(C 2018 6.5.2.4 3和1)指的是加法运算符。这些(6.5.6)的规范规定(第8段):
如果指针操作数和结果都指向同一数组对象的元素,或超过数组对象最后一个元素的元素,则计算不应产生溢出;否则,行为是未定义的
由于在这种情况下,p--
的结果没有指向消息的元素或超出该元素的元素,因此C标准没有定义该行为。我看不出有问题。只有在取消引用时,它才会超出范围。这不是问题,编译器和代码都可以正常工作。但是当我看到它时,我有点畏缩,我个人会花一些时间考虑避免它的替代方法。请注意,从
向函数传递负值具有未定义的行为。由于char
在传递给toupper()
之前可能是signed
更好地转换为charunsigned
,isalpha()
…@swardfish如果不是,则*p
具有先前的值,并且根本不递增。我不知道为什么这是错误的。爱拉布怎么样?@stukov哈哈,谢谢;)你当然是对的。