以下例子都在GCC下make 了一把,符合程序后面的解答:
- void GetMemory(char *p)
- {
- p = (char *)malloc(100);
- }
- void Test(void)
- {
- char *str = NULL;
- GetMemory(str);
- strcpy(str, "hello world");
- printf(str);
- }
请问运行Test函数会有什么样的结果?
答:程序崩溃。
因为GetMemory并不能传递动态内存,
Test函数中的 str一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。
- char *GetMemory(void)
- {
- char p[] = "hello world";
- return p;
- }
- void Test(void)
- {
- char *str = NULL;
- str = GetMemory();
- printf(str);
- }
请问运行Test函数会有什么样的结果?
答:可能是乱码。(ps:这里可能和编译器有关,试过自己的机子上GCC是NULL的)
因为GetMemory返回的是指向"栈内存"的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
- 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函数会有什么样的结果?
答:
(1)能够输出hello
(2)内存泄漏,因为strcpy遇到'\0'停止,此时str所指的堆空间中hello后面的内存并不是'\0',所以printf会出现内存泄露 (ps: 在自己机子上编译运行没有出现,可能编译器做了优化 ?)
- void Test(void)
- {
- char *str = (char *) malloc(100);
- strcpy(str, "hello");
- free(str);
- if(str != NULL)
- {
- strcpy(str, "world");
- printf(str);
- }
- }
请问运行Test函数会有什么样的结果?
答:篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str成为野指针,
if(str != NULL)语句不起作用。(ps:会有乱码)