为什么这样做?
#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()
,我得到一个分段错误.这主要是我很好奇的.
这是未定义的行为.不要那样做!! .
您正尝试访问分配区域之外的内存位置.因此,内存位置无效,访问无效内存调用UB.
FWIW,
在C标准中注意到阻止你访问出界(无效)内存和
strcpy()
与源长度相比,它们都不会检查目标缓冲区的大小
所以,这段代码(以某种方式)编译.一旦你运行它并击中UB,就不再保证任何东西了.
这基本上是C的指针是低级别且(通常)未检查的事实的另一个证明.你说你期望它"因没有足够的记忆而失败",但想一想:你期望失败的是什么?该strcpy
函数最确定不会检查它复制的字符串是否有足够的空间.它没有办法这样做; 它得到的只是一个指针.它只是开始复制字符,实际上它会在分段违规时成功或死亡.(但关键是它不会因"内存不足" 而死亡.)
归档时间: |
|
查看次数: |
70 次 |
最近记录: |