内存操作(指针,变量的生存期及作用范围,良好的动态内存申请和释放习惯)(
2011-12-09 16:40
537 查看
首先看看几个容易出错的问题:
(1)void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}
结果:程序崩溃。
因为 GetMemory 并不能传递动态内存, Test 函数中的 str 一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。
修正:GetMemory 函数为 char* GetMenory(char* p){return p=(char *) malloc(100);}
(2)char *GetMemory( void )
{
char p[] = "hello world";
return p;
}
void Test( void )
{
char *str = NULL;
str = GetMemory();
printf( str );
}
结果:可能是乱码。
因为 GetMemory 返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容在函数结束时已经被清除,新内容不可知。可以返回局部变量的值,但不能返回局部变量的地址。(尽量不要让返回值为局部变量)
修正:GetMemory 函数为 char* GetMenory(char* p){return p = "hello world";}
(3)void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );
}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
}
结果:输出字符串"hello"。
(4[b])void Test( void )[/b]
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
结果:free(str) 之后,str 成为野指针, if(str != NULL)语句不起作用。详情看野指针的介绍。
(1)void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}
结果:程序崩溃。
因为 GetMemory 并不能传递动态内存, Test 函数中的 str 一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。
修正:GetMemory 函数为 char* GetMenory(char* p){return p=(char *) malloc(100);}
(2)char *GetMemory( void )
{
char p[] = "hello world";
return p;
}
void Test( void )
{
char *str = NULL;
str = GetMemory();
printf( str );
}
结果:可能是乱码。
因为 GetMemory 返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容在函数结束时已经被清除,新内容不可知。可以返回局部变量的值,但不能返回局部变量的地址。(尽量不要让返回值为局部变量)
修正:GetMemory 函数为 char* GetMenory(char* p){return p = "hello world";}
(3)void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );
}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
}
结果:输出字符串"hello"。
(4[b])void Test( void )[/b]
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
结果:free(str) 之后,str 成为野指针, if(str != NULL)语句不起作用。详情看野指针的介绍。
相关文章推荐
- 指针,变量的生存期及作用范围,良好的动态内存申请和释放习惯
- 良好的动态内存申请和释放习惯
- c语言中的内存管理(重点:动态内存申请释放,野指针,指针函数)
- c语言中的内存管理(重点:动态内存申请释放,野指针,指针函数)
- 指针操作超越变量作用范围的问题(高质量c++)
- 结构体包含二级指针和二级指针内存的申请与释放问题
- C++类中静态STL容器中的指针所指向的动态内存空间如何释放!
- System.New、System.Dispose - 为某个指针申请和释放内存
- 数组内存申请和释放,指针数组和数组指针
- 动态申请内存与释放时的异常---Byte越界(CheckBytes函数的内部机制)
- 高质量C++编程之(7.5 free 和delete 把指针怎么啦? 7.6动态内存会被自动释放吗?)
- 指针动态申请内存的错误分析
- C语言创建链表错误之通过指针参数申请动态内存实例分析
- 动态申请和释放内存
- C和指针之动态内存分配(读取范围在1和标准输入读取的size之前每个数据出现的次数)
- malloc和free(1)——malloc()申请内存得到指针,指针没有改变,用free()释放内存,不会报错
- 为什么程序退出前还要释放动态申请的内存资源
- 《IOS_C语言》程序存储区划分、动态申请内存、内存操作函数
- 数组、指针和字符串:动态内存分配和释放
- 动态申请内存与释放时的异常---Byte越界(CheckBytes函数的内部机制)