这个指针超出范围了吗?

时间:2018-11-22 15:12:35

标签: 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: ");
    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]数组之外吗?

我在下面将其递减,但我想知道让它具有这种行为是否被认为是不好的做法。

2 个答案:

答案 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标准定义的。