C 在堆栈上声明内存将覆盖以前声明的内存

C 在堆栈上声明内存将覆盖以前声明的内存,c,stack,alloca,C,Stack,Alloca,如何在堆栈上分配内存并使其指向不同的内存地址,以便以后使用?例如此代码: for (int i = 0; i < 5; i++) { int nums[5]; nums[0] = 1; printf("%p\n", &nums[0]); } for(int i=0;i

如何在堆栈上分配内存并使其指向不同的内存地址,以便以后使用?例如此代码:

for (int i = 0; i < 5; i++) {
    int nums[5];
    nums[0] = 1;
    printf("%p\n", &nums[0]);
}
for(int i=0;i<5;i++){
int nums[5];
nums[0]=1;
printf(“%p\n”,&nums[0]);
}

每次都会打印出相同的地址。如何将内存写入堆栈(不是堆,不是malloc)并使其不覆盖堆栈上已有的其他内容。

我相信您正在寻找:

一种控制如何在堆栈上分配内存的方法,至少在不覆盖已使用内存的情况下是这样

当然,这是由操作系统负责的!低级系统调用将确保新创建的自动变量不会写入已使用的内存块

在您的示例中:

for (int i = 0; i < 5; i++) {
  int nums[5];
  ...
}
for(int i=0;i<5;i++){
int nums[5];
...
}
情况并非如此,因为当for循环的第i次迭代终止时,
nums
将超出范围


因此,在第一次迭代期间存储到的内存块
nums
在第二次迭代开始时将被标记为空闲,这意味着当第一次迭代的
nums
将在堆栈中分配时,它将不知道第一次迭代的
nums
是否存在,因为这已经超出了范围-它不存在

您可以使用
alloca
为循环中的每个迭代从运行时堆栈中分配不同的数组。在退出函数之前,数组内容将保持有效:

#include <stdlib.h>
#include <stdio.h>

void function() {

    for (int i = 0; i < 5; i++) {
        int *nums = alloca(5 * sizeof(*nums));
        nums[0] = 1;
        printf("%p\n", (void *)nums);
        /* store the value of `num` so the array can be used elsewhere.
         * the arrays must only be used before `function` returns to its caller.
         */
        ...
    }
    /* no need to free the arrays */
}
#包括
#包括
空函数(){
对于(int i=0;i<5;i++){
int*nums=alloca(5*sizeof(*nums));
nums[0]=1;
printf(“%p\n”,(void*)nums);
/*存储'num'的值,以便该数组可以在其他地方使用。
*数组只能在'function'返回其调用者之前使用。
*/
...
}
/*无需释放阵列*/
}

但是请注意,
alloca()
不是C标准的一部分,并且可能不适用于所有体系结构。关于如何使用它还有更多的限制,请参阅您系统的文档。

在环路外分配一个5×5阵列?请您更好地解释一下您想要什么?我们试图了解你,但不确定我们是否成功。。。我不确定你是否要求一些可能的东西^^