关于malloc()的奇怪行为

ale*_*der -2 c malloc

为什么这样做?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{

    char * abc = malloc(1) + 4; //WRONG use of malloc.
    char * xyz = "abc";
    strcpy(abc, xyz); //Should fail.
    printf("%s\n", abc); //Prints abc
}
Run Code Online (Sandbox Code Playgroud)

我希望strcpy因没有足够的内存而失败,因为我将1传递给malloc()的参数.相反,它可以完美地编译和运行(在Linux上的GCC和Windows上的dev c ++).

这是预期的行为,还是一个幸福的巧合?

我认为这不是一个好习惯,但为什么它有效?

没有+4最后malloc(),我得到一个分段错误.这主要是我很好奇的.

Sou*_*osh 6

这是未定义的行为.不要那样做!! .

您正尝试访问分配区域之外的内存位置.因此,内存位置无效,访问无效内存调用UB.

FWIW,

  • 在C标准中注意到阻止你访问出界(无效)内存和

  • strcpy()与源长度相比,它们都不会检查目标缓冲区的大小

所以,这段代码(以某种方式)编译.一旦你运行它并击中UB,就不再保证任何东西了.

PS - 这里唯一有保障的是未定义的行为.


Ste*_*mit 5

这基本上是C的指针是低级别且(通常)未检查的事实的另一个证明.你说你期望它"因没有足够的记忆而失败",但想一想:你期望失败的是什么?该strcpy函数最确定不会检查它复制的字符串是否有足够的空间.它没有办法这样做; 它得到的只是一个指针.它只是开始复制字符,实际上它会在分段违规时成功或死亡.(但关键是它不会因"内存不足" 死亡.)