int i in for 循环不更改地址(C 语言)



所以我正在尝试动态生成一个随机整数数组。问题是相同的地址 j 被添加到数组中。有人能对此有所了解吗?谢谢你的时间。

#define size 100
int main(void){
    srand(time(NULL));
    int *array = (int *) malloc(sizeof(int) * size);
    for (int i = 0; i < size; i += 1){
        int j = rand();
        array[i] = &j;
    }
    IntArray_printArray(array, size);
}

打印功能的输出:

Array Contents: [2702], [2702], [2702], [2702], [2702], [2702],  ... [2702], [2702], [2702], [2702], [2702], [2702],  ... [2702], [2702], [2702], [2702], [2702], [2702]

编辑1:"IntArray_printArray"功能:

void IntArray_printArray(int *array, int size){
    printf("Array Contents: ");
    if (size <= 20){
        printf("Array Contents: ");
        for (int i = 0; i < size - 1; i += 1){
            printf("[%d], ", *(int*)array[i]);
        }
        printf("[%d]n", *(int*)array[size-1]);
    } else {
        for (int i = 0; i < 6; i += 1){
            printf("[%d], ", *(int*)array[i]);
        }
        printf(" ... ");
        for (int i = size/2 - 3; i < size/2 + 3; i += 1){
            printf("[%d], ", *(int*)array[i]);
        }
        printf(" ... ");
        for (int i = size - 6; i < size - 1; i += 1){
            printf("[%d], ", *(int*)array[i]);
        }
        printf("[%d]n", *(int*)array[size-1]);
    }
}

j的地址未指定,但不是随机的。 虽然从技术上讲,它不必在每次循环迭代中都位于同一地址,但如果您遇到一个没有将其放在同一地址的编译器,我会感到惊讶。

要记住的另一件事是,一旦循环完成,j的生命周期就结束了。 因此,存储在array元素中的任何地址的生命周期都结束了。 取消引用这些指针不再有效。

因此,IntArray_printArray()打印出来的值甚至可能不反映您存储在 j 变量中的任何随机值(我假设IntArray_printArray()打印数组中指针指向的值,而不是指针本身的值)。

j 的地址不会改变C++因为编译器优化了变量j的创建并为其分配了一个固定地址(基本上在堆栈上)。

以下是汇编语言级别(伪 asm)上可能发生的情况:

2702 
2698 <- stack_ptr pointing here(32 bit machine)
;new instruction to create `j`
addl stack_ptr, $4 ;j created
2702 <- stack_ptr pointing here now
2698

for块结束后,堆栈指针递减 4

2702
2698 <- stack_ptr here, after loop block ends, but not that `for` loop itself has ended.

循环往复。

只需使用这个:

数组[i] = j;

否则,您将存储随机数的固定地址。

编辑:以上对我来说效果很好,添加了一些测试代码供克里斯检查:

#include <stdio.h>
#include <stdlib.h>
int main() {
    srand(time(NULL));
    const int size = 10;
    int *array = (int *) malloc(sizeof(int) * size);
    for (int i = 0; i < size; i++){
        int j = rand();
        array[i] = j;
        printf("array[%d] = %d n", i, array[i]);
    }
    return 0;
}

我认为即使J的生命周期的地址只是在循环中,但它是堆栈中的相同地址,就像Aniket所说的那样。

最新更新