指针与内存分配
时间:2010-10-15 来源:libin1201119
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
int main(void)
{
char *GetMemory(char *p) ;
char *pt = (char *)malloc(100) ;
printf("%s\n",GetMemory(pt)) ;
free(pt) ;
pt = NULL ;
return 0 ;
}
char *GetMemory(char *p)
{ assert(p != NULL) ;
printf("p=%p\n" , p) ;
int i ;
int k ;
char str[] = "hello world!" ;
char *address = p ;
k=(sizeof str)/sizeof(char) ;
for (i=0;i<k;i++)
*p++ = str[i];
return address;
}
分析:
执行函数时,函数内部局部变量的存储单元在栈上创建。结束后被释放.
return语句不要返回指向栈内存的指针,因为内存在函数体结束时被销毁。GetMemory中的address指针地址=main函数中的指针地址。所以return指针所指向的内存的生命周期为整个函数的运行时间。数组要么在静态存储创建,要么在栈上创建,数组名对应着(而不是指着)一块内存。上例中的str数组存活在GetMemory被调用的周期中。
利用malloc分配内存后一定要free掉,并且将malloc返回的指针置为NULL,不然将会产生野指针。
assert是仅在DEBUG版本起作用的宏,用于检查不应该发生的情况。当不可能发生的情况发生了,则结束程序。
#include <malloc.h>
#include <assert.h>
int main(void)
{
char *GetMemory(char *p) ;
char *pt = (char *)malloc(100) ;
printf("%s\n",GetMemory(pt)) ;
free(pt) ;
pt = NULL ;
return 0 ;
}
char *GetMemory(char *p)
{ assert(p != NULL) ;
printf("p=%p\n" , p) ;
int i ;
int k ;
char str[] = "hello world!" ;
char *address = p ;
k=(sizeof str)/sizeof(char) ;
for (i=0;i<k;i++)
*p++ = str[i];
return address;
}
分析:
执行函数时,函数内部局部变量的存储单元在栈上创建。结束后被释放.
return语句不要返回指向栈内存的指针,因为内存在函数体结束时被销毁。GetMemory中的address指针地址=main函数中的指针地址。所以return指针所指向的内存的生命周期为整个函数的运行时间。数组要么在静态存储创建,要么在栈上创建,数组名对应着(而不是指着)一块内存。上例中的str数组存活在GetMemory被调用的周期中。
利用malloc分配内存后一定要free掉,并且将malloc返回的指针置为NULL,不然将会产生野指针。
assert是仅在DEBUG版本起作用的宏,用于检查不应该发生的情况。当不可能发生的情况发生了,则结束程序。
相关阅读 更多 +