提问人:Newb 提问时间:10/19/2023 更新时间:10/19/2023 访问量:43
C 语言中的数组下标和指针算法给出不同的结果
Array subscripting and pointer arithmetics in C give different result
问:
当使用数组下标语法时,尝试获取位于数组内的值的地址时,我得到了不同的内存地址(无效的地址),而不是使用指针算术时,它确实产生了预期的(正确的)内存地址。 为什么?
此代码是使用 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
如您所见,是无效的。
但是当使用常量而不是变量时,我得到了正确的内存地址......0
arg
pos_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
这是正确的(第二次编译)。
答:
4赞
Ted Lyngmo
10/19/2023
#1
由于 是 ,使值 ( “wrapps around” 并成为最大可能值 ) - 这几乎超出了任何数组的范围。arg
unsigned
-arg - 1
unsigned
UINT_MAX
0u - 1
unsigned
-0 - 1
另一方面,是使用 s 完成的,结果是 。int
-1
评论
0赞
Newb
10/19/2023
天啊。。。这样的菜鸟错误,谢谢。
0赞
Ted Lyngmo
10/19/2023
@Newb 这是一个容易犯的错误!别客气!
上一个:为什么变量的地址在这里发生变化?
评论