黑马程序员技术交流社区

标题: 求教,不理解 [打印本页]

作者: 2014571245    时间: 2014-4-24 19:58
标题: 求教,不理解
本帖最后由 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");
}

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



作者: 郑亚鸽    时间: 2014-4-24 20:13
在运行到主函数的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;
}
作者: blz01003hm    时间: 2014-4-24 20:37
楼主真能找茬啊~ ~
#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;
}
作者: gmadong@163.com    时间: 2014-4-24 21:32
本帖最后由 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;

}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2