将值分配给动态分配的int数组似乎超出了给定的限制

问题描述

我有以下功能(用C语言编写)

void initArr (int ** arr,int size,int value) {
* arr = (int*)malloc(size * sizeof(int));
if (*arr!=NULL) {
        for (int i = 0; i<size;i++) {
            *(*arr + i) = value;
        }
    }
}

我在main中称呼

int main(void) {
    int *myArr = NULL;
    initArr(&myArr,10,45);
    for (int i = 0; i<15; i++) {
        printf("myArr[%d] = %d\n",i,*myArr);
    }
    return 0;
}

输出为:

myArr[0] = 45
myArr[1] = 45
myArr[2] = 45
myArr[3] = 45
myArr[4] = 45
myArr[5] = 45
myArr[6] = 45
myArr[7] = 45
myArr[8] = 45
myArr[9] = 45
myArr[10] = 45
myArr[11] = 45
myArr[12] = 45
myArr[13] = 45
myArr[14] = 45

我不明白的是,我仅将数组的前10个元素明确分配给了给定值。但是,当我打印超过第十个元素时,我看到该值也已分配给这些元素。为什么呢?

解决方法

要注意的两件事,如注释中所述,您仅取消引用了指向第一个元素的指针。 您可以通过for (int i = 0; i<15; i++,myArr++)printf("myArr[%d] = %d\n",i,myArr[i]);进行修复 既然我们已经解决了这个问题,尝试到达不属于您的内存是未定义的行为。您只为指针分配了10 * sizeof(int)字节,因此您应该只写该内存,并且只应该读出该内存。您不应该依赖代码中发生的结果,这是错误的做法,并且可能导致错误的代码。