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[下标]是可以访问这个变量的但是不可以修改
因为这个变量是存储在静态存储区,简单的来说就是你想修改一个常量吗?


发布了3 篇原创文章 · 获赞 3 · 访问量 69

猜你喜欢

转载自blog.csdn.net/m0_46300070/article/details/104632993
今日推荐