对于GetMemory()函数
NO1
void GetMemory(char *p)
{
       p=(char *)malloc(100);
}
void Test()
{
  char * str=NULL;
  GetMemory(str);
  strcpy(str,"Hello world");
  printf(str);
}
 
实质:GetMemory(str)在调用时会生成一个_str与str指向同一个数,这是因为C语言中函数传递形参不改变实参的内容,但是指针指向的内容是相同的,因此可以用指针控制数据。题中的GetMemory(str),实质是对_str的操作,并没有对str操作,函数结束后_str撤销,因此不会产生新的内存空间,str仍然是一个空指针。
 
NO2
char *GetMemory()
{
       char p[]="Hello World";
       return p;
}
void Test()
{
       char * str=NULL;
       str=GetMemory();
       printf(str);
}
实质:当一个函数调用结束后会释放内存空间,释放它所有变量所占用的空间,所以数组空间被释放掉了,也就是说str所指向的内容不确定是什么东西。但是返回的指针指向的地址是一定的。
 
NO3
char *GetMemory()
{
       Return “hello world”;
}
void Test()
{
       char * str=NULL;
       str=GetMemory();
       printf(str);
}
实质:本例打印hello world,因为返回常量区,而且并没有修改过。在上一个例子中不一定能打印hello world,因为指向的是栈区。
 
NO4
void GetMemory(char **p,int num)
{
       *p=(char *)malloc(num);
}
void Test()
{
       char * str=NULL;
       GetMemory(&str,100);
       strcpy(str,"Hello");
       printf(str);
}
可以正确的打印Hello但是内存泄露了,在GetMemory()中使用了malloc申请内存,但是在最后却没有对申请的内存做任何处理,因此可能导致内存的泄露,非常危险。
 
NO5
void Test()
{
       char *str=(char *)malloc(100);
       strcpy(str,"Hello");
       free(str);
       if (str!=NULL)
       {
              strcpy(str,"World");
              printf(str);
       }
}
申请空间,拷贝字符串,释放空间,前三步操作都没有问题,到了if语句里的判断条件开始出错了。因为一个指针被释放了之后其内容并不是NULL,而是一个不确定的值,所以if语句永远不能被执行,这也是著名的“野”指针问题。
 
NO6
void GetMemory(void)
{
       char *str=(char *)malloc(100);
       strcpy(str,"hello");
       free(str);
       if (str !=NULL)
       {
              strcpy(str,"world");
              printf(str);
       }
}
Str 为野指针,打印的结果不能确定。

对于GetMemory()函数相关推荐

  1. Getmemory函数详解--内存操作的理解

    题目:void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemor ...

  2. 关于getMemory函数的几点思考

    关于getMemory函数的几点思考 昨天,一个同事给我出来一道题,让我改错,虽然错误我找出来了,但是改错却没有改对,惭愧啊.所以今天做下笔记,算是给自己一个复习吧. 原题代码如下: void Get ...

  3. 面试题--特别是字节对齐

    来源:http://www.cnblogs.com/Braveliu/archive/2013/01/04/2844757.html [1]设置或者清除某位. 示例代码如下: 1 #include&l ...

  4. C/C++面试题分享

    1.指针和引用的区别? 答:引用是在C++中引入的.它们之间的区别有: (1)       非空区别:指针可以为空,而引用不能为空 (2)       可修改区别:如果指针不是常指针,那么就可以修改指 ...

  5. C/C++基础面试题集锦

    2019独角兽企业重金招聘Python工程师标准>>> 1.#include<>与#include""的区别 当用#include"file ...

  6. 下述程序有什么问题?

    下述程序有什么问题? #include<string.h> #include<stdio.h>  #include<stdlib.h> void getmemory ...

  7. C/C++练习题(一)

    1. volatile 关键字在 C++ 中的性能和 C 的一样? 作用是一样的,但是其内部实现原理可能不同. 2. scanf 格式化输入是怎么赋值的? 由于scanf输入的数据个数是不定的,从键盘 ...

  8. malloc 不能返回动态内存

    关于malloc的理解: #include <stdio.h> #include <stdlib.h> void getmemory(char *p) {p=(char *) ...

  9. 浙江绿盟科技2011.10.14校园招聘会笔试题

    1.以下哪些协议不是应用层通信协议? A.HTTP.TELNET          B.FTP.SMTP       C.SNMP.NBNS         D.ICMP.ARP 2.Ping命令是使 ...

最新文章

  1. shell脚本编程之呈现数据
  2. 【12图】你管这破玩意叫Pulsar
  3. 内连接,外链接(左连接、右连接、全连接),交叉连接大总结
  4. 枚举数据类型 c# 114866833
  5. nginx开发笔记_ngx_hash源码解析
  6. 逆向透视表 python_Python实现数据的透视表
  7. 异常和中断处理流程: Exception- or Interrupt-Handler Procedures
  8. php跨域传sessionid,php中http与https跨域共享session的解决方法
  9. 3结构介绍_接收机基本结构
  10. CentOS 6.4 安装 media wiki 1.23.6(转)
  11. [转载]JAVA操作符
  12. 实用干货:电放提单详解,与海运单、一般提单到底有什么区别?
  13. ftp上传软件,推荐六款优秀的ftp上传软件
  14. ISO9000、CMM(I)、6sigma与对象分析技术
  15. m-TRP transmission for URLLC(draft)
  16. [1] Word样式/主题/模板
  17. .net 微信表情应用
  18. ubuntu 18.04下greenplum安装笔记(二)安装Greenplum的失败的尝试
  19. 软件测试发展前景进阶路线
  20. python magic number_编程中的「魔数」(magic number)是什么意思?平时我们能接触到哪些魔数?...

热门文章

  1. 微信小程序中的json格式文件
  2. HTML、 CSS、 JavaScript三者的关系
  3. MATLAB转化彩色图片为灰度图片命令行窗口代码:
  4. Python实现经典七种排序算法
  5. iPhone SE 3钢化膜已上架海外市场:4.7英寸屏 Home键得到保留
  6. 谷歌Pixel 6系列正式发布:搭载自研Tensor SoC 规格超骁龙888
  7. 钉钉用户数破5亿 低代码应用数8个月增长86万
  8. 苏宁易购:2021年度预计商品采购总金额增至不超120亿元
  9. 1499元!魅族Watch“天青”配色正式首销:与手机完全互联互通
  10. 1.1万亿!华为第一!