提问者似乎不太了解 C 语言,建议阅读《K & R》等基础教程。
变量赋值错误(崩溃原因)
你试图通过 GetMemory()
把 *str
指向一段 malloc()
分配的内存。
但是,C 语言的函数传参是按值传参,*str
的值 NULL
被拷贝到 *p
,随后 *p
被指向 malloc()
返回的值,此时 GetMomory()
函数结束。*str
的值仍然为 NULL
,没有任何变化。之后,你使用 strcpy
企图把 "hello world"
复制到 NULL
,当然出错。
正确的做法是,传递指针变量 *str
的地址给 GetMemory(char **p)
。*str
本身就是一个指针,指向一个地址。*str
虽然是指针,但指针也有自己的地址,把 *str
的地址传给 **p
,**p
便是一个指向指针的指针。
到此为止,你的主要问题已经解决。可以跳过剩余部分直接看代码。
遗漏 free()
程序退出后,操作系统会自动释放所有内存。但是,使用完内存后立刻释放永远没错。
# `printf()` 用法错误
另外,你的 `printf()` 用法错误。`printf()` 的参数不能直接是要打印的数据。而需要一个带转换说明符的**字面字符串**,后面的参数是要格式化的实参。
没有 #include
任何头文件
使用库函数前需要 #include
提供相应函数的头文件。
printf()
由 stdio.h
提供
malloc()
由 stdlib.h
提供
strcpy()
由 string.h
提供
没有 main()
函数
main()
函数是程序的入口,没有入口,程序从何处执行?
更正后的程序如下。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void GetMemory(char **p)
{
*p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf("%s\n", str);
free(str);
*str = NULL; // 避免误用已悬空的指针
}
int main(void)
{
Test();
return 0;
}