c - *(arr -1) 和 arr[-1] 一样吗?

标签 c

我正在尝试解决这个问题,它有一个 vector 并且有一个指向负索引的指针。我想知道 C 是否忽略它并将其视为正数,或者它在 vector 中向后移动,例如 -1 是数组的最后一个元素。

最佳答案

是的,你可以有负索引。这是根据 C 中指针运算的定义得出的,即 p[i] 完全等同于 *(p + i),并且对于 是完全合法的i 为负数。

所以,不,这个标志没有被忽略。此外,如果您直接处理数组,则没有规则表明负索引是根据数组的末尾计算的。如果您直接处理数组,负索引最终会尝试访问数组开头“偏左”的内存,这完全违反规则,导致未定义的行为 .

您可能希望尝试这个说明性程序:

#include <stdio.h>

int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int *p = &arr[4];
    int *endp = &arr[8];

    printf("%d %d %d\n", arr[0], arr[4], arr[8]);        /* prints "1 5 9" */
    printf("%d %d %d\n", p[-1], p[0], p[1]);             /* prints "4 5 6" */
    printf("%d %d %d\n", endp[-2], endp[-1], endp[0]);   /* prints "7 8 9" */
    printf("x %d %d x\n", arr[-1], endp[1]);             /* WRONG, undefined */

}

正如注释所指出的那样,最后一行是错误的。它试图访问数组 arr 之外的内存。它将打印“随机”垃圾值,或者理论上它可能会崩溃。

关于c - *(arr -1) 和 arr[-1] 一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72858146/

相关文章:

c - 我不明白这些变量如何用于 getchar

c - 如何在 C 中反转字符串(不在适当的位置)?

c - 多进程服务器还是多线程服务器?

c - 在 C 中为 AVL 树存储字符串

c - 目标文件到二进制代码

c - 即使分配了大堆栈大小,如何消除堆栈溢出错误?

c - 如何监控GDB中的变量,如果满足一定的条件就记录下来?

c++ - Ruby FFI 找不到某些功能?

c - 关于如何对这一行进行编程的建议

c - 我自己的 C Shell 的历史问题