2021-08-05 C语言内存分配问题

一、1、编写程序如下:

//下面程序会出现什么结果 
#include
#include
#include  

void getmemory(char *p)
{
    p=(char *)malloc(100);
    strcpy(p,"hello word");
 } 
 
 int main()
 {
     char *str=NULL;
     getmemory(str);
     printf("%s/n",str);
     free(str);
     return 0;
 }

2、运行,结果为:

2021-08-05 C语言内存分配问题_第1张图片

 3、分析原因

 /*程序有问题,输出结果为null。修改(char *p)为(char **p)仍然不行。
网上的答案是:程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险。不理解。*/  

二、1、编写程序如下:

//问输出结果是什么?说说原因

#include
#include
#include
void GetMemory(char **p,int num)
{
    *p=(char *)malloc(num);
}

int main()
{
    char *str=NULL;
    GetMemory(&str,100);
    strcpy(str,"hello");
    free(str);
    if(str!=NULL)
    {
        strcpy(str,"world");
    }
    printf("\n str is %s",str);
    return 0;
}

2、输出结果如下:(注意,return 0不能少,否则不出运行结果)

2021-08-05 C语言内存分配问题_第2张图片

3、分析原因

网上分析原因如下:

free 只是释放的str指向的内存空间,它本身的值还是存在的.

所以free之后,有一个好的习惯就是将str=NULL.

此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,

尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。

这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。

当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不过。。。。。。。。楼上都说过了,最好别这么干。

你可能感兴趣的:(c语言)