有关C中指针的一些需要注意的问题 请看下面几道题:
(1)void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test函数会有什么样的结果?
(2)
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test函数会有什么样的结果?
(3)
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test函数会有什么样的结果?
(4)
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?
大家看看,看看指针在使用过程中我们需要注意些什么
对第一个程序,我只想说 任何函数调用都是值调用.
通过p = (char *)malloc(100)而使变量p的值发生变化,但副本值的改变对str是没影响的,所以不能完成给str指针初始化.(PS: p在函数执行时是在栈里面的,而他所指向的地址却是在堆里面的,在函数GetMemory完后p被释放掉,但它所指向的内存还在,所以还会造成内存的泄露啊).
第二个程序,在GetMemory执行完时,虽然p的值是返回了,但p所指的内存以释放了,所以printf(str);show的值是无法预测的.
第四个程序,free(str)是释放掉str所指向的内存,而str就成为野指针,if(str != NULL)也就失效了,strcpy(str, “world”); 可能产生严重错误.
指针是个比较难懂的东西。
程序1:
程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。strcpy(str, "hello world");将使程序崩溃。
程序2:
可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
程序3:
(1)能够输出hello
(2)内存泄漏
原因是申请的内存没被释放,内存泄露
程序4:
答:篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str成为野指针,if(str != NULL)语句不起作用,仍然执行if中的内容,修改动态内存中未知的部分。所以在free(str)之后为了以防万一得加上str=NULL
LZ研究下看看