永发信息网

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

答案:4  悬赏:50  手机版
解决时间 2021-03-23 17:11
都说动态数组能跨函数调用,但是我发现静态数组也能跨函数调用,这是为什么?
#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;
}
最佳答案
函数结束后,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;
}
全部回答
追问一下, int main(void) { int * pArr; pArr = staticArr(); printf("%d\n", *( pArr + 1) );//这里可以访问到1 printf("%d\n", *( pArr + 2) );//这里不可访问2了,为什么只能第一次访问正确? return 0; }
staticArr();函数返回后,arr占用的内存已经被程序释放, 但读这个内存地址里的内容还是 合法的 问题是这个内存被释放后, 可能又被其他程序调用, 其内容有可能在你读取前已经被更改, 所以你读出的内容可能不变, 也可能已经变了。
staticArr();函数返回后,arr占用的内存已经被程序释放, 但读这个内存地址里的内容还是 合法的 问题是这个内存被释放后, 可能又被其他程序调用, 其内容有可能在你读取前已经被更改, 所以你读出的内容可能不变, 也可能已经变了。 再看看别人怎么说的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
登长城的诗句,描写长城的诗句有哪些
刚上一本线怎么填志愿
NET是什么意思
在玩CF中。有个匪徒穿的是黑色的衣服。看起来
单选题初一学生王某怀疑其同桌赵某偷了他的电
2004年底特律活塞队夺冠全部阵容
请推荐一下比较适合女生看的网游言情小说,完
长脚馄饨东兴连锁店地址在什么地方,想过去办
幼儿教师教育格言,幼儿园老师快乐的格言
怎么删除C:/Program Files/common files/Auto
甘南都什么不多见的姓氏
我是1994年农历5月14日1时10分,我老公是1990
根号内678的平方十1358十690 678等于多少
如图,点E、A、B、F在同一条直线上,AD与BC交
苹果手机插耳机有声音,拔了就没音了,怎么回
推荐资讯
单选题下列运算结果等于1的是
翰墨熏香这句成语啥意思
三万台币等于多少人民币?
饥荒9个最好的建家地址 饥荒建家地址选哪里
QQ音速里面的表情有永久的吗?拜托各位大神
我想问下苏教版初一上册美术书的第二课身边的
龙禧大药堂龙江镇四门店地址在什么地方,想过
设x+y+z=a,xy+yz+xz=b,则x2+y2+z2=________
广州市从化区打击走私领导小组办公室在哪里啊
带耳机的男的开一辆红色轿车被警车追是什么电
杭州城市规划展览馆怎么样
尼日利亚+1.0 +1.5是什么意思
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?