关于malloc(0)的对与错

       当malloc分配内存时它除了分配我们指定SIZE的内存块,还会分配额外的内存来存储我们的内存块信息,用于维护该内存块。

       因此,malloc(0)返回一个合法的指针并指向存储内存块信息的额外内存,我们当然可以在该内存上进行读写操作,但是这样做了会破坏该内存块的维护信息,因此当我们调用free(ptr)时就会出现错误。

       *char ptr = (char )malloc(0sizeof(char)) ;

       ptr是局部指针变量,存储在栈中,它的值是动态分配的一块堆中的空间的首地址所以说这个地址是合法的,但是由于malloc的大小是0,故这个地址指向的堆中的存储空间的大小是0。

       这个指针类似于一个野指针,可以使用的,但是是有风险的,因为不知道这个指针后面的内存空间被谁使用着,要是被核心进程使用,哪肯定会造成相应程序的崩溃关于加上free后,程序就会崩溃。

在VS中编译出错。
关于malloc(0)的对与错_第1张图片
但是在Qt中可以编译成功,free没有报错。

#include 
#include 
#include 

using namespace std;

int main(int argc, char *argv[])
{
    char s[10] = "123456789";
    char *p = (char *)malloc(0);

    if(NULL == p){
        cout << "null" << endl;
    }else{
        cout << "not null" << endl;
        p = s;
        cout << p<< endl;
        free(p);
    }
    return 0;
}

关于malloc(0)的对与错_第2张图片

你可能感兴趣的:(关于malloc(0)的对与错)