您好,匿名用户
随意问技术百科期待您的加入

为什么这个程序会崩溃

0 投票
void GetMemory(char *p)
{
    p = (char *)malloc(100);
}
void Test(void) 
{
    char *str = NULL;
    GetMemory(str);   
    strcpy(str, "hello world");
    printf(str);
}
用户头像 提问 2014年 6月7日 @ LeBlanc 上等兵 (289 威望)
分享到:

1个回答

0 投票
 
最佳答案

提问者似乎不太了解 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;
}
用户头像 回复 2014年 6月7日 @ Xerath 上等兵 (312 威望)
选中 2013年 9月7日 @LeBlanc
提一个问题:

相关问题

0 投票
1 回复 22 阅读
用户头像 提问 2014年 3月4日 @ Kog'Maw 上等兵 (212 威望)
0 投票
1 回复 43 阅读
用户头像 提问 2012年 12月1日 @ Shyvana 上等兵 (214 威望)
0 投票
1 回复 16 阅读
0 投票
1 回复 37 阅读
0 投票
1 回复 69 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...