所以我正在尝试动态生成一个随机整数数组。问题是相同的地址 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所说的那样。