对于GetMemory()函数
对于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()函数相关推荐
- Getmemory函数详解--内存操作的理解
题目:void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemor ...
- 关于getMemory函数的几点思考
关于getMemory函数的几点思考 昨天,一个同事给我出来一道题,让我改错,虽然错误我找出来了,但是改错却没有改对,惭愧啊.所以今天做下笔记,算是给自己一个复习吧. 原题代码如下: void Get ...
- 面试题--特别是字节对齐
来源:http://www.cnblogs.com/Braveliu/archive/2013/01/04/2844757.html [1]设置或者清除某位. 示例代码如下: 1 #include&l ...
- C/C++面试题分享
1.指针和引用的区别? 答:引用是在C++中引入的.它们之间的区别有: (1) 非空区别:指针可以为空,而引用不能为空 (2) 可修改区别:如果指针不是常指针,那么就可以修改指 ...
- C/C++基础面试题集锦
2019独角兽企业重金招聘Python工程师标准>>> 1.#include<>与#include""的区别 当用#include"file ...
- 下述程序有什么问题?
下述程序有什么问题? #include<string.h> #include<stdio.h> #include<stdlib.h> void getmemory ...
- C/C++练习题(一)
1. volatile 关键字在 C++ 中的性能和 C 的一样? 作用是一样的,但是其内部实现原理可能不同. 2. scanf 格式化输入是怎么赋值的? 由于scanf输入的数据个数是不定的,从键盘 ...
- malloc 不能返回动态内存
关于malloc的理解: #include <stdio.h> #include <stdlib.h> void getmemory(char *p) {p=(char *) ...
- 浙江绿盟科技2011.10.14校园招聘会笔试题
1.以下哪些协议不是应用层通信协议? A.HTTP.TELNET B.FTP.SMTP C.SNMP.NBNS D.ICMP.ARP 2.Ping命令是使 ...
最新文章
- shell脚本编程之呈现数据
- 【12图】你管这破玩意叫Pulsar
- 内连接,外链接(左连接、右连接、全连接),交叉连接大总结
- 枚举数据类型 c# 114866833
- nginx开发笔记_ngx_hash源码解析
- 逆向透视表 python_Python实现数据的透视表
- 异常和中断处理流程: Exception- or Interrupt-Handler Procedures
- php跨域传sessionid,php中http与https跨域共享session的解决方法
- 3结构介绍_接收机基本结构
- CentOS 6.4 安装 media wiki 1.23.6(转)
- [转载]JAVA操作符
- 实用干货:电放提单详解,与海运单、一般提单到底有什么区别?
- ftp上传软件,推荐六款优秀的ftp上传软件
- ISO9000、CMM(I)、6sigma与对象分析技术
- m-TRP transmission for URLLC(draft)
- [1] Word样式/主题/模板
- .net 微信表情应用
- ubuntu 18.04下greenplum安装笔记(二)安装Greenplum的失败的尝试
- 软件测试发展前景进阶路线
- python magic number_编程中的「魔数」(magic number)是什么意思?平时我们能接触到哪些魔数?...