我对程序堆栈有一些疑问。
我正在尝试提供输入数组,对其进行处理并返回经过处理的数组。(想保存输入数组。)并尝试避免使用全局变量。
英语不是母语,请原谅我的英语..!
int* func(int* input_array, int size)
{
int arr[20] = { };
int* arr_alloc = (int*)malloc(sizeof(int)* 3);
for (int i = 0; i < size; i++)
{
arr[i] = input_array[i];
}
arr[3] = 4;
/*for (int i = 0; i < size; i++)
{
arr_alloc[i] = input_array[i];
}
arr_alloc[3] = 4;
free(arr_alloc);*/
// return arr_alloc;
return arr;
}
int main()
{
int input_arr[20] = { 0, };
printf("%d", func(input_arr,10)[3]);
}
1-1。当我返回在my_func中声明为局部变量的local_arr时,它在调试模式下正常工作。但我认为这不是一个好方法。
1-2。程序堆栈是在编译时确定的,不是吗?
1-3。程序堆栈在运行时是否不变?
1-4。我猜如果程序堆栈是不可变的,我可以返回arr_local。
2-1当我使用malloc使用堆段时。我可以在分配范围之外释放(arr_alloc)吗?如果它是可能的。是否推荐?
2-2我在返回arr_alloc之前做了free(arr_alloc),但它工作正常。仅仅是因为arr_alloc堆内存尚未被覆盖吗?
3-1什么是处理数组的好代码。
1-1。当我返回在my_func中声明为局部变量的local_arr时,它在调试模式下正常工作。但我认为这不是一个好方法。
是。您不想返回一个不再存在的对象的指针,因为取消引用是非法的,因为它没有指向有效的对象。
1-2。程序堆栈是在编译时确定的,不是吗?
这不是一个明确定义的问题。堆栈仅在运行时存在。处理它的代码是在编译时创建的。在编译时可能知道或可能不知道各种堆栈的大小。
1-3。程序堆栈在运行时是否不变?
不,它不断变化。
1-4。我猜如果程序堆栈是不可变的,我可以返回arr_local。
我不知道这意味着什么,您将返回arr_local
的值,而不是arr_local
本身。该值是指向堆上对象的指针。那与堆栈有什么关系?
2-1当我使用malloc使用堆段时。我可以在分配的范围之外释放(arr_alloc)吗?如果它是可能的。是否推荐?
是。完成操作后,您应该free
。
2-2我在返回arr_alloc之前做了free(arr_alloc),但它工作正常。仅仅是因为arr_alloc堆内存尚未被覆盖吗?
该值仍然是一个值,可以很好地返回它。只是不要取消引用它。那可以做任何事情,因为它是一个不再存在的对象的指针。
3-1什么是处理数组的好代码。
[需要数组时,请调用malloc
。返回指向它的指针。完成后,调用free
。