C 马洛克';d存储器与sigsegv

C 马洛克';d存储器与sigsegv,c,linux,malloc,C,Linux,Malloc,帮助我理解malloc的行为。。我的代码如下: int main() { int *ptr=NULL; ptr=(int *)malloc(1); //check for malloc *ptr=1000; printf("address of ptr is %p and value of ptr is %d\n",ptr,*ptr); return 0; } 以上程序运行良好(运行无误)…如何??因为我只在1字节

帮助我理解malloc的行为。。我的代码如下:

    int main()
    {   
    int *ptr=NULL;
    ptr=(int *)malloc(1);
    //check for malloc
    *ptr=1000;

    printf("address of ptr is %p and value of ptr is %d\n",ptr,*ptr);
    return 0;
    }
以上程序运行良好(运行无误)…如何??因为我只在1字节中提供了1000的值

我是否覆盖堆中的下一个内存地址?
如果是,那么sigsgev为什么不存在呢?

使用调试堆,当您释放内存时(但您没有调用free),肯定会收到崩溃或其他一些通知


分段错误用于页面级访问冲突,内存页通常为4k左右,因此,除非某些更细粒度的检查检测到溢出3字节,否则不太可能检测到溢出,或者代码的其他部分崩溃,因为您用“垃圾”重写了一些内存。

malloc的许多实现将以特定的“分辨率”分配效率

这意味着,即使你要求一个字节,你也可能得到16或32

然而,它不是你可以依赖的东西,因为它是未定义的行为


未定义的行为意味着任何事情都可能发生,包括整个工作过程,尽管代码有问题:-)

行为未定义,因此它可能会崩溃,也可能不会崩溃。在某些实现中,当您
free(ptr)
时,程序将崩溃。它与打包有关吗??通常情况下,32位应用程序的默认打包为4字节。先生,(这可能是一个愚蠢的问题……但我需要问一下)。。“malloc的许多实现”是什么意思???对于所有使用gcc n glibc(从标准网站下载)的ppl,实现/定义必须相同…na??n malloc、free等函数没有标准定义吗?@saurabh:是的,gcc(或mor-glibc)可能有特定的实现,但这不是唯一的实现。MSVC有自己的,IBMs xlc有另一个等等。GLibC只是一种实现。是的,ISO C标准规定了定义,但它通常涵盖行为而非实现。大多数
malloc
实现都是以更大的块(通常是几页4Kbytes)从操作系统(通常是内核,通过系统调用)请求堆内存。在Linux上,
malloc
有时可能会使用
mmap
(可能还有
sbrk
)系统调用从内核请求“大块”内存。然后
malloc
的实现会将块切割成更小的块,等等。。。。和往常一样,邪恶在于细节。要了解更多关于make的信息,您可以查看malloc的标题。另外,你也可以使用ptr的内存。。。直到你在ptr+x发生车祸。x是您正在使用的malloc用户库的粒度。