C 语言中的数组下标和指针算法给出不同的结果

Array subscripting and pointer arithmetics in C give different result

提问人:Newb 提问时间:10/19/2023 更新时间:10/19/2023 访问量:43

问:

当使用数组下标语法时,尝试获取位于数组内的值的地址时,我得到了不同的内存地址(无效的地址),而不是使用指针算术时,它确实产生了预期的(正确的)内存地址。 为什么?

此代码是使用 gcc C99 和 C11 编译的,标志:-Wall -O0。

#include <stdio.h>

int main() {
    unsigned int arg = 0;
    char         arr[5] = {'a', 'b', 'c', 'd', 'e'};
    char*        arrp   = arr + 2;
    char*        pos_1  = arrp - arg - 1;
    char*        pos_2  = &arrp[-arg - 1];
    printf("arr:  %p\narrp: %p\npos_1:%p\npos_2:%p\n", arr, arrp, pos_1, pos_2);
    return 0;
}

结果:

arr:  0x7fff31035a73
arrp: 0x7fff31035a75
pos_1:0x7fff31035a74
pos_2:0x800031035a74

pos_2如您所见,是无效的。

但是当使用常量而不是变量时,我得到了正确的内存地址......0argpos_2

#include <stdio.h>

int main() {
    char         arr[5] = {'a', 'b', 'c', 'd', 'e'};
    char*        arrp   = arr + 2;
    char*        pos_1  = arrp - 0 - 1;
    char*        pos_2  = &arrp[-0 - 1];
    printf("arr:  %p\narrp: %p\npos_1:%p\npos_2:%p\n", arr, arrp, pos_1, pos_2);
    return 0;
}

这导致:

arr:  0x7ffc270c4ed3
arrp: 0x7ffc270c4ed5
pos_1:0x7ffc270c4ed4
pos_2:0x7ffc270c4ed4

这是正确的(第二次编译)。

数组 C 指针 内存地址

评论


答:

4赞 Ted Lyngmo 10/19/2023 #1

由于 是 ,使值 ( “wrapps around” 并成为最大可能值 ) - 这几乎超出了任何数组的范围。argunsigned-arg - 1unsignedUINT_MAX0u - 1unsigned

-0 - 1另一方面,是使用 s 完成的,结果是 。int-1

评论

0赞 Newb 10/19/2023
天啊。。。这样的菜鸟错误,谢谢。
0赞 Ted Lyngmo 10/19/2023
@Newb 这是一个容易犯的错误!别客气!