第一道:被鄙视 的 C语言语法问题

请看 下面 程序 :

错误程序:

void GetMemory( char *p )
{
 p = (char *) malloc( 100 );
}
void Test( void ) 
{
 char *str = NULL;
 GetMemory( str ); 
 strcpy( str, "hello world" );
 printf( “%s”,str );
}

这个一个考验对指针理解的题目,上面程序在运行之后:

1,调用GetMemory( str )后, str并未产生变化,依然是NULL.只是改变的str的一个拷贝的内存的变化

2,strcpy( str, "hello world" );程序运行到这将产生错误。

3,new的时候有可能内存出错,应该在*p = (char *) malloc( num ); 后判断内存是否申请成功,应加上:
     if ( *p == NULL )
   {
     ...//进行申请内存失败处理
   }

4,动态创建的内存没释放。

错误分析:

错认为 GetMemory(char   *p)中的 p “就是” GetMemory(str)中的str。但p“不是”str,它只是“等于”str 。 
就象:   int   a   =   100;   
            int   b   =   a;       //   现在b等于a   
            b   =   500;         //   现在能认为a   =   500 ?      
  显然不能认为a   =   500,因为b只是等于a,但不是a!  当b改变的时候,a并不会改变,b就不等于a了。    因此,虽然p已经有new的内存,但str仍然是null

形参 :只是 又 开辟了 一个  char * 类型的 变量 ,并把 str 的值 赋值 给 p,因此 申请 的 空间地址赋值的 是P,即对形参赋值, 而不是对实参 str赋值,所以 对 str 进行 赋值 会 hardfault !

那如何  改变 实参 那,那么形参 传递 的应该是 实参 的地址 ,这样才可以改变实参,分析整个过程是调用函数的时候:形参的值 = 实参的值, 函数内部,又对形参的值进行赋值,没有对实参进行赋值!, 实参的 地址 即指针!这道题 要 改变 的是 一个 char * 类型的变量,那么 形参 应该 设置 为 指向 char * 类型变量的指针,即 char **p 即 GetMemory(char   **p),那么  函数调用 的时候应该是GetMemory(&str),这道题 迷惑之处在于 形参 是一个 指针变量,而要改变实参 的值 ,不应该是实参变量的值,而应该传递实参变量的地址!

第二道:被鄙视 的 C语言语法问题,知乎上可以搜到类似的题目

char *  类型 的 p,  指向  的 字符串 存放 在 那里?   选项有以下 三种: 即 内存 的 分布区域 划分:

静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。

答案 是: 静态存储区。

最新文章

  1. 常用Git代码托管服务分享
  2. 创建struct类型的数组
  3. scp 指定端口
  4. JSP 笔记
  5. bash if 表达式
  6. 轻奢品牌全面崛起 Coach、UGG等纷纷抢滩新兴市场_新闻中心_赢商网
  7. WPF 后台绑定样式
  8. js List<Map> 将偏平化的数组转为树状结构并排序
  9. You are what you write——沈向洋
  10. (转)flutter 新状态管理方案 Provide (一)-使用
  11. [P3613]睡觉困难综合征
  12. 10_python_函数进阶
  13. Linux uniq命令详解
  14. JTAG Communications model
  15. Tcl写法
  16. 在Load average 高的情况下如何鉴别系统瓶颈
  17. interface思考练习一
  18. yii2框架(一)安装
  19. JavaFX学习之Web
  20. Base64编码原理

热门文章

  1. Spring部分面试知识
  2. csharp:A Custom CheckedListBox with Datasource
  3. 前端面试经典题目(HTML+CSS)二
  4. sql-pivot
  5. latex 图形的放置
  6. arcgis10.2 serverstyle 制作工具位置 小计
  7. Android BitmapDrawable
  8. 使用NodeJs搭建的小型web应用
  9. JUnit测试模块使用
  10. Scratch www 系统搭建