Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不更改地址的for循环中的int i(c语言)_C_Arrays_Dynamic_Int - Fatal编程技术网

不更改地址的for循环中的int i(c语言)

不更改地址的for循环中的int i(c语言),c,arrays,dynamic,int,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被添加到数组中。有人能帮我解释一下吗?谢谢你抽出时间

#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);
}
编辑1:“IntArray\u printArray”功能:

Array Contents: [2702], [2702], [2702], [2702], [2702], [2702],  ... [2702], [2702], [2702], [2702], [2702], [2702],  ... [2702], [2702], [2702], [2702], [2702], [2702]
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]);
    }
}
void IntArray\u printary(int*array,int size){
printf(“数组内容:”);

如果(size<p>),代码> j>代码>地址不改变,因为C++编译器优化变量<代码> j/COD>的创建,并给它分配一个固定地址(基本上在栈上)。 以下是汇编语言级别(伪asm)上可能发生的情况:

循环会重复。

只需使用以下命令:

数组[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;
}
#包括
#包括
int main(){
srand(时间(空));
常数int size=10;
int*数组=(int*)malloc(sizeof(int)*大小);
对于(int i=0;i
j
的地址是未指定的,但它不是随机的。虽然从技术上讲,它不必在每次循环迭代中都位于同一地址,但如果您遇到一个编译器没有将其置于同一地址,我会感到惊讶

另一件需要记住的事情是,一旦循环完成,
j
的生存期就结束了。因此,存储在
数组
元素中的任何地址的生存期都结束了。不再去引用这些指针是无效的


因此,由
IntArray\u printary()
打印的值甚至可能不会反映存储在
j
变量中的任何随机值(我假设
IntArray\u printary()
打印数组中指针指向的值,而不是指针本身的值).

我认为,尽管j的生存期地址只是在循环中,但它在堆栈中是相同的地址,正如Aniket所说。

似乎是函数IntArray\u printary造成的。发布此函数的代码,让我们能够判断问题。编译器应该对此代码发出警告,如
array[i]
是一个
int
,但您正试图为它分配一个
int*
。如果您没有启用警告,请这样做。如果是,请不要忽略警告。@Thx,我添加了函数
size
的值是多少?您初始化了吗?否则
malloc
可能会失败,然后您将如果malloc失败,当你分配给
array[i]
时,我会得到一个分段错误,因为
array==NULL
如果malloc失败。是的,它在顶部定义。我会添加它。这会导致程序崩溃。程序是如何崩溃的?崩溃的行是什么?错误是什么?我不知道。我在使用Eclipse;它只是在说“program.exe已停止工作。Windows正在检查问题的解决方案…”嗨,Chris,它对我有效,一定是你的程序中的其他东西导致了问题。请参阅上面的编辑,我添加了一些测试代码供你检查,这对我来说运行良好。这实际上是一个非常深刻的答案,值得仔细阅读。
2702
2698 <- stack_ptr here, after loop block ends, but not that `for` loop itself has ended.
#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;
}