永发信息网

C语言 静态数组也能跨函数调用,不会随着函数执行完毕而销毁吗?

答案:4  悬赏:50  手机版
解决时间 2021-03-23 17:11
  • 提问者网友:做自己de王妃
  • 2021-03-23 03:39
都说动态数组能跨函数调用,但是我发现静态数组也能跨函数调用,这是为什么?
#include <stdio.h>
#include <malloc.h>

int * staticArr(void)
{
int arr[5] = {1, 2, 3, 4, 5};

arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
arr[4] = 4;

return arr;
}

int main(void)
{
int * pArr;
pArr = staticArr();

printf("%d\n", *( pArr + 1) ); //这里能访问到staticArr创建的静态数组

return 0;
}
最佳答案
  • 五星知识达人网友:西岸风
  • 2021-03-23 04:29
函数结束后,staticArr中的数组Arr内存被释放,但不会立即被系统收回,一般编译系统/操作系统都有一定的优化过程。你的程序中中有你的这部分需要内存,没有其它变量干扰,当然能得到正确结果,一旦有其它操作干扰,就能看出结果了,不信试试如下程序;

#include <stdio.h>
#include <malloc.h>

int * staticArr(void)
{
int arr[5] = {1, 2, 3, 4, 5};

arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
arr[4] = 4;

return arr;
}

int main(void)
{
int * pArr;
int *p;
pArr = staticArr();
p=(int*)malloc(sizeof(int)*8);

printf("%d\n", *( pArr + 1) ); //这里能访问到staticArr创建的静态数组

free(p);

return 0;
}
全部回答
  • 1楼网友:蕴藏春秋
  • 2021-03-23 06:54
追问一下, int main(void) { int * pArr; pArr = staticArr(); printf("%d\n", *( pArr + 1) );//这里可以访问到1 printf("%d\n", *( pArr + 2) );//这里不可访问2了,为什么只能第一次访问正确? return 0; }
  • 2楼网友:举杯邀酒敬孤独
  • 2021-03-23 06:25
staticArr();函数返回后,arr占用的内存已经被程序释放, 但读这个内存地址里的内容还是 合法的 问题是这个内存被释放后, 可能又被其他程序调用, 其内容有可能在你读取前已经被更改, 所以你读出的内容可能不变, 也可能已经变了。
  • 3楼网友:忘川信使
  • 2021-03-23 05:16
staticArr();函数返回后,arr占用的内存已经被程序释放, 但读这个内存地址里的内容还是 合法的 问题是这个内存被释放后, 可能又被其他程序调用, 其内容有可能在你读取前已经被更改, 所以你读出的内容可能不变, 也可能已经变了。 再看看别人怎么说的。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯