Getmemory的几个经典的关于内存的笔试题

TEST  1:

void GetMemory1(char *p) {
  p = (char *)malloc(100);
  }
void Test1(void) {
  char *str = NULL;
  GetMemory1(str);
  strcpy(str,"hello world");
  printf(str);
  }

p是一个处于栈区的变量,生命周期只从定义到区间的‘}’结束;

所以在Getmemory函数结束的时候p的内存被自动释放,无法进行strcpy操作;

TEST  2:

char *GetMemory2(){ 
  char p[] ="hello world";
  return p;
  }
void Test2(){
  char *str = NULL;
  str = GetMemory2();
  printf(str);
  }

同TEST  1,栈区的空间自动释放,无法输出。

TEST  3:

char *GetMemory3(){
  char *p ="hello world";
  return p;
  }
void Test3(){
  char *str = NULL;
  str = GetMemory3();
  printf(str);
  }

无问题,可以正常输出;

输出"hello world";

TEST  4:

char *GetMemory4(){
  static char p[] ="hello world";
  return p;
  }
void Test4(){
  char *str = NULL;
  str = GetMemory4();
  printf(str);
  }

是合法的,能够正常输出;

经过了static修饰之后,处于栈区的变量延长了生命周期,可以在本文件范围内进行访问;

输出"hello world";

TEST  5:

void Test5(){
  char *str = (char *) malloc(100);
  strcpy(str,"hello");
  free(str);
  //str = NULL;
  if (str != NULL) {
    strcpy(str,"world");
    printf(str);
    }
  }

过早的释放了str的内存,在注释那行之后str已经没有地址了;

无法进行strcpy操作;

TEST  6:

void Test6(){
  char *str=(char *)malloc(100);
  strcpy(str,"hello");
  str+=6;
  free(str);
  if (str != NULL){
    strcpy(str,"world");
    printf(str);
    }
  }

第六行:str+=6;偏移了从堆区申请的空间地址;

释放的空间地址和申请的空间地址必须相同,不能随意偏移;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汝即来归

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值