首页 > 解决方案 > 将值分配给动态分配的 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;
        }
    }
}

我主要调用它:

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 个元素显式分配给了给定值。但是,当我打印超过第 10 个元素时,我看到该值也分配给了这些元素。这是为什么?

标签: cpointersprintfdynamic-memory-allocation

解决方案


需要注意的两件事,如评论中所述,您仅取消引用指向第一个元素的指针。您可以在我们解决它之前for (int i = 0; i<15; i++, myArr++)printf("myArr[%d] = %d\n", i, myArr[i]); 现在修复它,尝试访问不“属于”您的内存是未定义的行为。您只为指针分配了 10 * sizeof(int) 字节,因此您应该只写入该内存,并且应该只读取该内存。你不应该依赖代码中发生的事情的结果,这是不好的做法,可能会导致糟糕的代码。


推荐阅读