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