都说动态数组能跨函数调用,但是我发现静态数组也能跨函数调用,这是为什么?
#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;
}
C语言 静态数组也能跨函数调用,不会随着函数执行完毕而销毁吗?
答案:4 悬赏:50 手机版
解决时间 2021-03-23 17:11
- 提问者网友:做自己de王妃
- 2021-03-23 03:39
最佳答案
- 五星知识达人网友:西岸风
- 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;
}
#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占用的内存已经被程序释放, 但读这个内存地址里的内容还是
合法的
问题是这个内存被释放后, 可能又被其他程序调用, 其内容有可能在你读取前已经被更改, 所以你读出的内容可能不变, 也可能已经变了。
再看看别人怎么说的。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯