【问题标题】:(C) Pointer Declared in function, is pointer lost after function finishes?(C) 函数中声明的指针,函数结束后指针会丢失吗?
【发布时间】:2013-01-18 03:05:07
【问题描述】:

首先,让我先说我知道这个问题已经在某个时候得到了回答。一定是这样,但我根本不知道找到答案的关键字。

我正在编写一个程序,在我的程序内部,我必须在各处创建多个动态大小的数组,然后将它们存储到一个大结构中。因此,如果我必须创建相同类型的动态分配数组,我会在一个函数中创建它(即声明它、malloc 并返回它)到我的结构字段。然而,现在我已经走上了这条路,我认为我犯了一个重大缺陷。我相信我所做的事情被函数的范围破坏了,这意味着一旦函数完成,原始指针就会被杀死,因此我的结构是指向不再是“我的”地址的指针。下面是对该函数的示例调用,希望它在没有 cmets 的情况下有意义。

//Call from main()
current_event->mens_names = create_names_matrix(number_of_couples, 20);

//my "create_names_matrix" function:
char ** create_names_matrix(int num_of_names, int length_of_names){
int i;
char **return_matrix;

return_matrix = malloc(num_of_names * sizeof(char*));
if(return_matrix == NULL){
    panic("return_matrix"); //Panic is a function that checks if malloc failed
}

for(i = 0; i < num_of_names; i++){
    return_matrix[i] = malloc(length_of_names * sizeof(char));
}

if(return_matrix[i-1] == NULL){
    panic("return_matrix"); //Panic is a function that checks if malloc failed
}
return return_matrix;

}

解决方案是继续声明并在主中动态创建每个字段数组,然后将其作为参数传递给我的每个“create_xxx_matrix”函数,以避免它们在函数范围完成后被杀死?

我知道这是一个菜鸟问题,但自从我使用指针和 c 以来已经有一段时间了。

谢谢!

【问题讨论】:

  • 你的问题解决了吗?

标签: c function scope


【解决方案1】:

动态分配的指针是在堆中分配的,不会被函数的作用域杀死。根据作用域,分配在堆栈中的变量一旦离开函数就会被销毁。

【讨论】:

  • 所以,只是为了确保我明白你在说什么......我声明它们是为了让它们在堆上,当然它们没问题,因为堆变量在功能完成。因此,我上面的代码应该可以工作吗?
【解决方案2】:

这会很好。你真正担心的不是指针本身,而是它指向的内存。指针实际上只是一个指示内存位置的数字(如 0x0043AF)。由于您使用了malloc(),因此您的内存在堆上,除非您专门调用free(ptr),否则它将永远不会被释放,这将释放所有指向的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多