c - 为什么我没有收到段错误?

标签 c segmentation-fault cstring

<分区>

Possible Duplicate:
Why don’t I get a segmentation fault when I write beyond the end of an array?

当我意识到发生了一些奇怪的事情时,我只是在玩指针。我知道每当我们想要将字符串 src 复制到另一个字符串 dst 时,例如使用 strcpy,我们应该分配所需的空间对于 src

    char *dst,*src = "asdlskafksdhfklshfkshdkfhksdhfçsahdflçsdhfçklshadfç";

    dst = (char*)malloc(1); //only one char allocated
    strcpy(dst,src);

    printf("dst=%s.\n",dst);

此代码不应执行。然而,这并没有发生。代码执行,成功地将 src 复制到 dst 并像魅力一样打印 dst 。你们中有人可以解释一下为什么会这样吗?

最佳答案

C 的部分性能在于它没有太多内置错误检查的方式。 strcpy 所知道的是它被传递了一个正确类型的指针,它不知道它指向了多少分配的内存。生成的机器代码只是简单地从 src 指针读取到第一个空字节,然后将其粘贴到 dst 指针中。如果它没有覆盖其他人的内存,则没有错误。

什么是“别人的内存”?通常一个进程在pages中分配内存.当您 malloc 一个字节时,进程将获得一整页内存,可能是几千字节,以根据需要进行切片和切 block 。当您的进程试图在其分配的页面之外写入时,会发生段错误,and for other reasons .该错误通常由执行内存管理的操作系统和/或硬件生成。由于 src 只有几十个字节,所以它不太可能走出进程的页面。如果您将 src 设为更长的字符串,您可能会得到您期望的段错误。

有各种用于调试的 malloc 包装库,通过各种技巧,使 C 检查内存错误。 ValgrindElectric Fence是一些最著名的。

PS 我对这些东西到底是如何工作的有点模糊,但它比“它是未定义的行为”更令人满意。请随时编辑我缺乏解释的地方。

关于c - 为什么我没有收到段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12849345/

相关文章:

c - 如何检查指针 (void) 的值不为零(尝试取消引用通用指针)

c - 访问共享内存段时出现段错误

c++ - 如何在 C++ 中删除 CString 中的字符串

c++ - 从 CString 中提取 float

c++ - 如何将 ATL/MFC CString 转换为 QString?

c - 当我在 C 中运行 for 循环时,程序停止响应

C - 'struct' 之前的预期表达式

c - 定位段错误的最简单方法

c - STM32CubeMX HAL_xxx_MspInit()函数中的MSP代表什么?

c++ - 我可以检查缓存中是否有一 block 内存(例如,使用 malloc 分配)吗?