c - 为什么-x[ptr]总是0?

标签 c pointers gcc

我的代码:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int *pi;
    short *ps;

    pi = malloc(16 * sizeof *pi);
    ps = malloc(16 * sizeof *ps);
    pi += 8;
    ps += 8;
    ps = (short*) pi;
    *pi = 1000000;
    printf("*pi = %d,", *pi);
    printf("*ps = %hd\n", *ps);
    printf("before incrementing ps : ps = %p\n", ps);
    ps++;
    printf("after incrementing ps : ps = %p\n", ps);
    printf("*ps = %hd\n", *ps);
    *ps = 16;
    printf("after *ps = %hd -> *pi = %d\n", *ps, *pi);
    printf("ps - 1 = %p, -1 + ps = %p\n", ps - 1,-1 + ps);
    printf("*(ps - 1) = %hd, *(-1 + ps) = %hd\n", *(ps - 1), *(-1 + ps));
    printf("0[ps - 1] = %hd, 1[ps - 2] = %hd, ps[-1] = %hd\n", 0[ps - 1], 1[ps - 2], ps[-1]);
    printf("-1[ps] = %hd, -2[ps + 1] = %hd, -3[ps + 2] = %hd\n", -1[ps], -2[ps + 1], -3[ps + 2]);
    printf("-3[ps] = %hd, -3[ps + 1] = %hd, -3[ps + 3] = %hd,", -3[ps], -3[ps + 1], -3[ps + 3]);
    printf("-3[ps + 4] = %hd\n",-3[ps + 4]);
}
/* format string in printf was adjusted to increase readability */

我的输出:

*pi=1000000,*ps=16960
before incrementing ps:ps=0xbb9030
after incrementing ps:ps=0xbb9032
*ps=15
after *ps=16->*pi=1065536
ps-1=0xbb9030,-1+ps=0xbb9030
*(ps-1)=16960,*(-1+ps)=16960
0[ps-1]=16960,1[ps-2]=16960,ps[-1]=16960
-1[ps]=0,-2[ps+1]=0,-3[ps+2]=0
-3[ps]=0,-3[ps+1]=0,-3[ps+3]=0,-3[ps+4]=0

我读过a[b]定义为*(a+b) 。因此,ps[-1]==*(ps-1)==*(-1+ps)==-1[ps] 。但是,如输出中所示,虽然除了最后一个表达式之外的所有表达式都具有预期值( 16960 ),但最后一个表达式的值为 0?

为什么会发生这种情况? -x[ps] 是否会产生未定义的行为,导致编译器仅使用 0?

供您引用,我使用 gcc。 gcc -v输出gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.5) .

最佳答案

一元否定 - 的优先级低于 []

因此 -1[ps] 的计算结果为 -(1[ps])

您还应该注意,指针算术仅在数组内定义:有一个重要的异常(exception),即您可以设置(尽管不能取消引用)指针,该指针位于数组末尾之后,或者位于标量地址之后。

其他一切都非常明显:特别是您无法访问数组边界之外的内容。

关于c - 为什么-x[ptr]总是0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46713030/

相关文章:

c - 当我运行这个非常基本的基于 SQLite3 的 C 文件时,为什么我总是得到 "Killed: 9"?

c - C 中的反斜杠百分比转义是什么?

c++ - 指针打印问题

c++ - 是什么限制了我在内存方面对堆栈的使用?

在C程序中复制文件,但文件为空

C 需要关于 char connect 和 split 函数的建议

c - 我试图从函数返回一个指针?但我无法取回该指定地址的值(value)

c - char* 的合法使用

c - 极其简单的 C 程序不会在 gcc 编译器中编译

switch 语句中的 C Char Switch 返回 case 表达式不是常量