几个关于内存的问题
2016-07-26 00:42
477 查看
问题:请问下面几个程序运行起来的结果分别是什么?
1.
因为GetMemory函数是无法传递动态开辟的空间的,所以主函数里的str一直都是NULL,这时程序再调用strcpy()函数,字符串str就没有空间拷贝“hello world”,从而程序崩溃。
2.
因为在GetMemory函数里的字符串是局部变量,局部变量是存放在栈里面,所以return语句最终返回的是栈内存的指针,而这个指针在函数体结束后是要被销毁的,所以现在返回的内容是不可知的。
3.
这里可以输出hello,但是存在内存泄漏问题。
4.
在这里str被释放掉了,str!=NULL起不到不起作用,str变成了野指针!!!!!!!
1.
void GetMemory(char *p) { p = (char *)malloc(100); } int main() { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); system("pause"); return 0; }答:程序崩溃。
因为GetMemory函数是无法传递动态开辟的空间的,所以主函数里的str一直都是NULL,这时程序再调用strcpy()函数,字符串str就没有空间拷贝“hello world”,从而程序崩溃。
2.
#include<stdio.h> #include<string.h> char *GetMemory() { char p[] = "hello world"; return p; } void main(void) { char *str = NULL; str = GetMemory(); printf(str); system("pause"); }答:输出乱码。
因为在GetMemory函数里的字符串是局部变量,局部变量是存放在栈里面,所以return语句最终返回的是栈内存的指针,而这个指针在函数体结束后是要被销毁的,所以现在返回的内容是不可知的。
3.
void GetMemory(char **p, int num) { *p = (char *)malloc(num); } void main(void) { char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); system("pause"); }答:输出hello。
这里可以输出hello,但是存在内存泄漏问题。
4.
void main() { char *str = (char *)malloc(100); strcpy(str, "hello"); free(str); if (str != NULL) { strcpy(str, "world"); printf(str); } system("pause"); }答:输出world。
在这里str被释放掉了,str!=NULL起不到不起作用,str变成了野指针!!!!!!!
相关文章推荐
- IE7降低内存和降低CPU的几个技巧
- 非常不错的脚本入侵基础知识总结第1/2页
- AS3 Flex基础知识100条
- Ruby基础知识之方法、代码段
- 如何高效的使用内存
- DOS下内存的配置
- Lua教程(二):基础知识、类型与值介绍
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- C#编程自学之开篇介绍
- SQL语句实现查询SQL Server内存使用状况
- C语言内存对齐实例详解
- 深入学习C语言中memset()函数的用法
- 全局变量与局部变量在内存中的区别详细解析
- ASP新手必备的基础知识
- VB读取线程、句柄及写入内存的API代码实例
- php运行提示:Fatal error Allowed memory size内存不足的解决方法
- ADO.NET基础知识汇总
- javascript基础知识大集锦(一) 推荐收藏