define _CRT_SECURE_NO_WARNINGS

include

include

include

//堆 char getMen(int num) { // / 栈中分配内存空间 p1 ,p1虽然在栈分配但main函函数中并不能使用它 并指向下面10个字节的堆内存空间 在getMen函数运行完后,在栈中消失,消失之前返回p1给main函数中的tmp,这时tmp指向堆中的10个字节内存空间 / char p1 = NULL;

  1. // 在堆里开辟10字节个内存空间, 这10个内存空间不会因为子函数 运行完而被析构,因为它在堆里
  2. p1 = (char *)malloc(sizeof(char) * num);
  3. if (p1 == NULL) {
  4. return NULL;
  5. }
  6. return p1;

}

//栈 注意return不是把内存块64个字节,给return出来,而是把内存块的首地址(内存的标号),返回给tmp / 理解指针的关键是内存,没有内存哪里来的指针 指针指向谁,就把谁的地址指向谁 / char *getMen2() { char buf[64]; //临时变量 栈区存放 strcpy(buf, “123456789”); printf(“buf:%s\n”, buf); return buf; }

void main() {

  1. char *tmp = NULL; // 栈中分配内存空间 tmp
  2. tmp = getMen(10);
  3. /*
  4. 所以在主调函数里调用getMenp,p1在内存(栈区)中被析构掉
  5. 但是main函里的tmp没有被析构掉,而是指向了p1指向堆(操作系统管理)
  6. */
  7. if (tmp == NULL) {
  8. return;
  9. }
  10. strcpy(tmp, "111222");//向tmp指向的内存空间copy数据
  11. //tmp = getMen2();
  12. printf("tmp:%d\n",*tmp);
  13. printf("tmp:%s.\n", tmp);// 有的系统这样的程序可能会崩溃 debug和relase效果是不一样的 原因就是临时区
  14. system("pause");

}