1.函数篇,跨函数使用内存

1.函数篇 跨函数使用内存

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *getmem(){
char str[100]="床前明月光“;
char *p =str;  //存储数组的首地址
return p; //返回内存的首地址
}

void main(){
char *pstr=NULL;# 定义一个空指针
pstr=getmem();   #获取内存的首地址
if(pstr!=NULL){
strcpy(pstr,"hello");
printf("%s",pstr);
system(“pause”);}

我们的本意是输出hello,却发现输出了很奇怪的字符


**首先因为数组是存储再栈区,其分配与释放不由我们决定,再调用的时候分配,调用结束就被释放了。
再strcpy函数我们其实是拷贝成功了,但是再printf函数时,这一片内存就被回收了

即:栈内存中的内容会被清除,我们不应该返回指向栈内存的指针**



  那我们应该如何解决这个问题呢?
  动态申请的内存再堆上,因此我们可以用动态申请内存从而实现跨函数使用内存
  
  也就是说我们只需要对getmem()函数做如下修改即可;
char * getmem(){
char *p=(char *) malloc(100);
return p;}
 
  我们就可以达成我们的目的了。当然,由于我们申请了这一片内存,这一片内存是要我们自己释放的,free(pstr); 即可
  


注;如何清这一片内存/
for(int i=0;i<100;i++){
p[i]=0;}  //p是指向这片动态分配的内存的指针


 char * getmem(){
char *p="hello world"; //这是存储再静态存储区的,要区别于上面
return p;}

void main(){
char *pstr=getmem();
printf("%s",pstr);//是能打印出来字符的

需要注意的是,静态存储区与栈与堆三者都是不一样的
静态数组是在栈,
malloc分配的动态数组是在堆
由于我们知道的hello world是字符串常量
我们通过p[下标]是可以访问这个变量的但是不可以修改
因为这个变量是存储在静态存储区,简单的来说就是你想修改一个常量吗?


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值