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

推荐答案

是的,可以有负索引.这源于C中指针算术的定义,即p[i]完全等于*(p + i)i为负数完全合法.

所以,不,这个标志并没有被忽视.此外,如果你直接处理一个数组,没有规则说负索引是相对于数组的末尾计算的.如果您直接处理一个数组,负索引最终会试图访问数组开头"左侧"的内存,这完全违反规则,导致undefined behavior.

您可能希望try 以下示例性程序:

#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 */

}

正如注释所示,最后一行是错误的.它try 访问数组arr外部的内存.它将打印"随机"垃圾值,否则理论上可能会崩溃.

C++相关问答推荐

问关于C中的指针和数组

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

C中出现分段错误后关闭文件

va_copy的使用是未定义的行为吗?

数据包未从DPDK端口传输到内核端口

C:scanf(%d&q;,...)输入只有一个减号

C编译器是否遵循restrict的正式定义?

创建一个fork导致fget无限地重新读取文件

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

如何创建一个C程序来存储5种动物的名字,并在用户 Select 其中任何一种动物时打印内存地址?

SSH会话出现意外状态

用C++实现余弦函数

强制转换变量以在 struct 中蚕食

处理来自浏览器的HTTP请求

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

仅从限制指针参数声明推断非混叠

对于STM32微控制器,全局偏移表.get和.Got.plt必须为零初始化

强制GCC始终加载常量(即只读),即使启用了优化

try 判断长整数是否为素数

C循环条件内的函数