c语言 - 如果使用函数 i 返回一个在其内部创建的指针,则在函数中创建的指针的 4 个字节在结束后会被释放吗?



欢迎对我的帖子质量发表任何评论,我是新的。

1)函数结束后,4 个字节的 temp(指针)会被清除吗?

2)(不是来自下面的代码)如果我有指向地址 A 的指针 1 并且我将地址 A 复制到指针 2,如何释放指针 1(4 个字节作为整数)占用的内存并仅保留新的指针 2?

(下面的代码)代码从用户那里获取一个数字(假设 4),并使用一个函数来制作一个大小为 4 的数组,每个插槽中都有 1

int * Array_K_Size(int number)
{
int *temp;
temp = (int *) calloc(number,sizeof(int));
for ( int i=0; i<number; i++)
temp[i] = 1;
return temp;
}
int main()
{
int number,*ptr=NULL;
printf("Give number: ");
scanf("%i",&number);
ptr = Array_K_Size(number);
for ( int i=0; i<number; i++)
printf("Position %3i of array is: %3in",i+1,ptr[i]);
return 0;
}

在函数中

int * Array_K_Size(int number)
{
int *temp;
temp = (int *) calloc(number,sizeof(int));
for ( int i=0; i<number; i++)
temp[i] = 1;
return temp;
}

您动态分配了一个数组,并返回了指向其第一个元素的指针。

其值分配给指针ptr

ptr = Array_K_Size(number);

即指针ptr获取存储在本地指针温度中的值的副本。局部变量 temp 在退出函数后将不处于活动状态。尽管如此,分配的动态内存在函数外部仍然有效。

要释放分配的内存,您只需调用

free( ptr );

指针temp的作用域是函数Array_K_Size的主体。

指针ptr的作用域是函数main的主体。

来自 C 标准(6.2.4 对象的存储持续时间)

5 一个对象,其标识符被声明为没有链接且没有链接 存储类说明符 static 具有自动存储持续时间, 就像一些复合文字一样。

6 对于没有可变长度数组类型的此类对象,它的生命周期从进入它所在的块开始延长 关联,直到该块的执行以任何方式结束

指针tempptr都有自动存储持续时间,但每个指针都在各自的块中声明。

最新更新