如果我取消对数组的引用,并添加超过数组中可用元素的5,则打印的值是多少我在IDE中返回32767,这没什么意义。
#include <stdio.h>
int main(void)
{
int i;
int meatBalls[5] = {1, 2, 3, 4, 5};
printf("%12s %18s %6s\n", "Element", "Address", "Value");
for(i=0; i < 5; i++) {
printf("meatBalls[%d] \t %p \t %d \n", i, &meatBalls[i], meatBalls[i]);
}
printf("\nmeatBalls \t\t %p \n", meatBalls); /*already a pointer*/
/*dereference meatBalls and it will update to the value e.g. 1*/
printf("\n*meatBalls \t\t %d \n", *meatBalls); /*dereference with asterisk*/
printf("\n*(meatBalls+2) \t\t %d \n", *(meatBalls+2)); /*dereference but also go through the array from 0 + 2*/
printf("\n*(meatBalls+4) \t\t %d \n", *(meatBalls+4));
printf("\n*(meatBalls+5) \t\t %d \n", *(meatBalls+5)); /*what is the number that this returns?*/
return 0;
}
这是电流输出,让我质疑“32767”:
Element Address Value
meatBalls[0] 0x7fff5b714640 1
meatBalls[1] 0x7fff5b714644 2
meatBalls[2] 0x7fff5b714648 3
meatBalls[3] 0x7fff5b71464c 4
meatBalls[4] 0x7fff5b714650 5
meatBalls 0x7fff5b714640
*meatBalls 1
*(meatBalls+2) 3
*(meatBalls+4) 5
*(meatBalls+5) 32767
最佳答案
不知道,不能说。
详细说明,在你的代码中
printf("\n*(meatBalls+5) \t\t %d \n", *(meatBalls+5));
当您试图访问超出限制的内存时导致undefined behavior。
请注意访问的重点本例中的指针算法定义良好(超过最后一个元素),试图访问导致UB的原因。
引用
C11
,第6.5.6章(重点矿山)[…]如果表达式
P
指向最后一个数组对象的元素,表达式
(P)+1
指向数组对象,如果表达式
Q
指向数组对象的最后一个元素的后面,表达式指向数组对象的最后一个元素如果两个指针
操作数和结果指向同一数组对象的元素,或指向超过最后一个数组对象的元素
数组对象的元素,求值时不应产生溢出;否则
行为未定义如果结果指向数组对象的最后一个元素的前面,则
不应用作计算的一元
(Q)-1
运算符的操作数。也就是说,
*
期望它的参数是一个%p
并且由于void*
是一个可变函数,因此不会发生默认的参数提升因此,您需要将所有参数强制转换为printf()
到%p