int in for for循环不改变地址(c语言)

时间:2013-11-17 04:01:12

标签: c arrays dynamic int

所以我试图动态生成一个随机整数数组。问题是相同的地址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]);
    }
}

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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.

并且循环重复。

答案 2 :(得分:1)

请使用:

array [i] = j;

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

编辑:上面的工作对我来说很好,为Chris添加了一些测试代码来检查:

#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;
}

答案 3 :(得分:0)

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