1题:
针对以下代码,
判断下列说法哪个是正确的() |
||
正确答案: A 你的答案: F (错误)str1和str2地址不同,P1和P2地址相同 str1和str2地址相同,P1和P2地址相同 str1和str2地址不同,P1和P2地址不同 str1和str2地址相同,P1和P2地址不同 4个地址都相同 4个地址都不同 |
解析:str1与str2:在栈中分配内存,指向不同地址。
p1,p2所指位置指向常量区。
关于栈,堆的内存分配:
1 静态分配发生在程序编译和连接时,动态分配则发生在程序调用执行时。
2 堆是动态分配的,没有静态分配的堆。
3 栈有两种分配方式,静态和动态。静态分配由编译器完成:如局部变量的分配。
4 动态分配由函数malloc分配,不过,栈的动态分配和堆不同,栈的由编译器进行释放,无需我们手工实现。
栈内存分配
—————
char*
AllocStrFromStack()
{
char pstr[100];
return pstr;
}
pstr在函数返回时被系统释放了。于是所返回的char*什么也没有
堆内存分配
—————
char*
AllocStrFromHeap(int len)
{
char *pstr;
if ( len <= 0 ) return NULL;
return ( char* ) malloc( len );
}
pstr是从堆上分配内存,故,即使是程序退出,也不释放,故第二个函数返回的内存没有问题,可以使用,但一定要用free释放,否则 发生内存泄露。