提问者似乎不太了解 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;
}