Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这个指针超出范围了吗?_C_Pointers - Fatal编程技术网

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哈哈,谢谢;)你当然是对的。