程序堆栈是不可变的吗?如何处理数组?

问题描述 投票:-1回答:1

我对程序堆栈有一些疑问。

我正在尝试提供输入数组,对其进行处理并返回经过处理的数组。(想保存输入数组。)并尝试避免使用全局变量。

英语不是母语,请原谅我的英语..!

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什么是处理数组的好代码。

c arrays stack heap
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.