1.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMemory(char *p);
void Test();
int main()
{
Test();
return 0;
}
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf(str);
}
分析:
在VS2010上编译可以通过,但是不能运行。
个人理解:
运行GetMemory()时,p是str的一个副本。虽然分配的空间没有被销毁,但是GetMemory只是让p指向分配好的空间,而没有让Test中的str也指向malloc分配的内存
所以不能运行。
Test中,str初始化为NULL(不再是野指针了),因此,strcpy可以通过编译。
2.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMemory(char *p);
void Test();
int main()
{
Test();
return 0;
}
char *GetMemory( void )
{
char p[] = "hello world";
return p;
}
void Test( void )
{
char *str = NULL;
str = GetMemory();
printf( str );
}
结果:编译通过,运行时输出随机值
原因:p为局部变量,函数执行完时被销毁。
注:函数执行完时,
3.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *tmp;
void GetMemory(char *p);
void Test();
int main()
{
Test();
return 0;
}
char *GetMemory( void )
{
char *p = "hello world";
// tmp = p;
return p;
}
void Test( void )
{
char *str = NULL;
str = GetMemory();
printf( str );
}
编译运行均没有问题,可以输出helloworld
“Hello world”在静态去
GetMemory将它的地址返回了。
4.