为什么...
char *dst = (char*) malloc(sizeof(char) * 11);
char *src = "ABCDEFGHIJKLMNOPQRSTUVQXYZ";
strncpy(dst, src, 10);
...工作正常,但是...
char *dst = "ABCDEFGHIJ ";
char *src = "ABCDEFGHIJKLMNOPQRSTUVQXYZ ";
strncpy(dst, src, 10);
...甚至...
char *dst = "ABCDEFGHIJ ";
char *src = "KLMNOPQRST ";
strncpy(dst, src, 10);
给出 segfault ?
另外,这是如何工作的:
char *dst = (char*) malloc(sizeof(char) * 10); // also works with 9
char *src = "ABCDEFGHIJKLMNOPQRSTUVQXYZ ";
strncpy(dst, src, 10);
将11个字节复制到分配了10个字节的指针中,应原则上的失败?
字符串文字可以存储在只读的内存段中。您不应该修改它们。
另外,没有检查范围的写作。您听到的许多安全问题是由于有很多代码没有任何界限检查的事实。
写作超出了分配的内存的界限,并尝试修改字符串字符字面或其他只读/常数数据,从而导致 undfined行为。。
区别在于,您初始化给指针的字符串文字 dst 和 src 在后面的情况下存储在数据段中。数据段是程序的虚拟地址空间的一部分,它包含由程序员初始化的全局变量和静态变量。
该段可以进一步分为初始化的读取区域和初始化的读取区域。
例如,由
定义的全局字符串char s[] = “hello world”
在C和像INT debug这样的C语句中,主(即全局)将存储在初始化的读取区域中。以及
的全局c语句const char* string = “hello world”
使字符串文字" Hello world"存储在初始化的读取区域和初始化读写区域中的字符指针变量字符串。
,在上述情况下...
char* dst = " ABCD........." ;
等于
const temp[]="ABCD......";
char* dst = &temp[0];
因此,DST指向的温度数组将存储在可读的内存中,因此您无法编辑它...
在最终情况下,即使您可以将11个字节复制到指向10个字节的指针中,您将在运行时间内遇到麻烦。...例如:尝试释放指针,您将面对分段故障...(未定义的行为)。
它是依赖编译器的。