为什么这个程序会崩溃

void GetMemory(char *p)
{
    p = (char *)malloc(100);
}
void Test(void) 
{
    char *str = NULL;
    GetMemory(str);   
    strcpy(str, "hello world");
    printf(str);
}
阅读 6.7k
2 个回答

娘的……答案评论里不支持贴代码,那我就另外加一个答案吧。对于最佳答案的一些评论

  1. printf 的原型是
int printf ( const char * format, ... );

因此,printf(str) 是可行的。

但是,如果 str 是用户输入的内容或外部获得的内容,str 中就可能含有恶意代码,可以用来进行内存溢出进而执行任意代码的攻击。因此,这样做应该是严格禁止的。—— Biergaizi

  1. c/c++对于申请的内存空间进行初始化是一个好习惯,所以做一个memset或者是把第一个单元初始化为零是值得鼓励的做法
  2. 另外像楼上说的,malloc的内存要记得free,否则一会就没有内存可以用了。同时记得free之后把指针清零。避免代码过长之后,错误调用这个已经free的指针
  3. c中的字符串是必须以0结尾的。这里你用的strcpy在复制字符串的时候帮你做了这件事情。但是你要心里有数。
  4. 你的GetMemory可以直接返回一个指针,就免去传递指针的指针这个问题了
char* GetMemory()
{
   char* p = (char *)malloc(100);
   memset(p, 0, SIZE); // or *p = 0;
   return p;
}

以下下代码在win7上编译,运行通过

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
void GetMemory(char **p)
{
   *p = (char *)malloc(
   memset(*p, 0, SIZE); // or **p = 0;
}

void Test(void) 
{
    char *str = NULL;
    GetMemory(&str);   
    strcpy(str, "hello world");
    printf(str);
    free( str);
    str = NULL;
}

int main(void)
{
    Test();
    return 0;
}

最简单的回答就是楼主没有搞清楚: 引用传递和值传递

想要修改str指向的内容,你得把指向str的指针传过去

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题