A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 2014571245 中级黑马   /  2014-4-24 19:58  /  1378 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 2014571245 于 2014-4-27 11:07 编辑

void GetMemory(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);       //p是形参指向的地址
}
void main()
{
char *str=NULL;
GetMemory(str,100);                            //str是实参指向的地址,不能通过调用函数来申请内存
strcpy(str,"hello");
}

结构是编译能通过,却不能运行,为什么呢?


评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

3 个回复

倒序浏览
在运行到主函数的strcpy(str,"hello")语句的时候发生错误,这时候观察str的值,发现仍然为NULL。也就是说str本身并没有改变,我们malloc的内存的地址并没有赋值给str,而是赋值给了_str。而这个_str是编译器自动编译和回收的,我们根本无法使用。所以像这样获取一块内存是不行的。

可以这样写:
char *GetMemory(char *p,int num)
{
    p=(char *)malloc(num*sizeof(int));
    return p; //return返回的指针所指向的内存必须是全局的或是malloc分配的,不能是在函数中的栈上分配。
}
int main()
{
    char *str=NULL; //将指针初始化为NULL
    str=GetMemory(str,10);
    strcpy(str,"hello");
    printf("str is %s\n",str);
    free(str);
    str=NULL; //将指针置空
    return 0;
}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
楼主真能找茬啊~ ~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char *GetMemory(char *p,int num)       //得把申请的堆内存传回去 相当于你写了个malloc
{

p=(char*)malloc(sizeof(char)*num);
return p;
}
int main()
{

char *str=NULL;
//str=(char *)malloc(sizeof(char)*10);
//GetMemory(str,100);
str=GetMemory(str,100);//GetMemory(str,100)中的str在这是没用的 因为它是NULL
strcpy(str,"hello");
puts(str);
return 0;
}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 gmadong@163.com 于 2014-4-24 21:40 编辑

void GetMemory(char *p,int num)
{

    p=(char*)malloc(sizeof(char)*num);      //在这句前就是在栈中有声明一个变量是p 指向传过来的NULL 执行完这句后就是p指向了别的地方
    //简单的就是你传的是指针 但这是值传递 只有通过指针的指针才能改变内容的
}
int main()
{
    char *str=NULL;     //执行完时在栈中有一个变量是str 指向NULL
    GetMemory(str,100);    //把NULL传给函数                  
    strcpy(str,"hello");

    return 0;
}
正确的写法:
void GetMemory(char **p,int num)
{
    *p=(char*)malloc(sizeof(char)*num);      
}
int main()
{
    char *str=NULL;
    GetMemory(&str,100);                           
    strcpy(str,"hello");
   printf("%s\n",str);
    return 0;

}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马