如果我取消对数组的引用,并添加超过数组中可用元素的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

07-24 09:44
查看更多