作为练习,我创建了以下程序:
#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;
}
这是一个问题/漏洞,是在第一个while
循环中,当最后一次输入时,p
指向message[100]
数组之外吗?
我在下面将其递减,但我想知道让它具有这种行为是否被认为是不好的做法。
答案 0 :(得分:4)
这是一个问题/漏洞吗?
否。
只要在
答案 1 :(得分:4)
由C标准(根据以下引用的标准中的文本)允许并定义p
的设置以指向message
数组之外的一个元素。
用户输入空白行时,p--
的行为不是C标准定义的。
当用户输入空白行时,第一个while
循环将不执行任何迭代,并且p
将保留其初始值(从message
设置)。
然后p--
递减p
,使其指向message
之外。
C中的指针不仅是地址数字,而且是数字。 C标准没有为它们定义任意算术。后缀--
的C规范(C 2018 6.5.2.4 3和1)引用加法运算符。这些规范(6.5.6)表示(第8段):
如果指针操作数和结果都指向同一数组对象的元素,或者指向数组对象的最后一个元素,则求值不应产生溢出;否则,行为是不确定的。
由于在这种情况下,p--
的结果没有指向message
的元素或指向它之外的元素,所以行为不是C标准定义的。