内存&传参 问题

char *GetMemory(void) //char型函数指针,返回值是一个地址
{
    char p[] = "hello world"; //定义一个char型数组,里面存放了一个字符串
    return p; // return &p[0]; 返回指针所指向的地址
} //运行至此,"hello world"被释放

int main()
{
    char *str = NULL; //定义一个指针,并且让这个指针指向内存的最前端(0x0000 0000),str = NULL
    str = GetMemory(); //str = &p[0]
    printf("%s", str); //此时str所指向的地址里面是随机值
    return 0;
}

结果:输出结果不确定

二:

void GetMemory(char *p, int Num) //str传递过来的是NULL, 也就是p=NULL
{
    p = (char *)malloc(sizeof(char) * Num);
}
int main()
{
    char *str = NULL;       //定义一个指针str,str = NULL
    GetMemory(str, 100);     //将NULL传递过去(传递的是一个值, NULL)
    strcpy(str, "hello");        //不能将hello 传递进去,因为str没有空间,是个野指针
    return 0;
}

结果:不能执行strcpy(str, "hello") , 会发生段错误

知识点:
原型char strcpy(char dest , char * source)
运用strcpy()这个函数的时候,确保dest是指向一个空间。否则,运行strcpy()会发生段错误。

三:

void GetMemory(char **p, int num)  // p = &str
{
    *p = (char *)malloc(num); //*p = str,也就是说str指向了申请到的内存的首地址
}
int main()
{
    char *str = NULL;  // 定义一个char型指针str,str = NULL
    GetMemory(&str, 100); //&str 取的指针str的地址
    strcpy(str, "hello");  //把 hello 放进 str 所指向的内存里面
    printf("%s", str);
    free(str);
    return 0;
}

结果:正确输出hello

四:

int main(void)
{
   char *str = (char *) malloc(100);  //定义一个char型指针str,并申请100个字节的内存,让str指向这块内存的首地址
   strcpy(str, "hello"); //把 hello 放进内存里面
   free(str); //将str所指向的内存释放,但str仍然是指向这块内存的首地址,值还在

   if(str != NULL)  //条件成立
   {
      strcpy(str, "world");
      printf("%s", str);
   }
}

结果:正确输出一个world

malloc()获取一块大小指定的可用的内存的使用权
free()释放对这个内存的使用权,

全部评论

相关推荐

头像
09-29 16:18
门头沟学院 Java
点赞 评论 收藏
分享
努力成为C语言高手:质疑大祥老师,理解大祥老师,成为大祥老师
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务