这个null怎么终止了?

时间:2017-05-19 16:23:53

标签: c

我知道在使用char数组时,你必须将字符串的长度初始化为字符串+ 1的长度,以便\0占用
但如果我不考虑\0 strchr如何声称\0在char数组中,因为这打印"是空终止"

char mark[4] = "mark";
if(strchr(mark, '\0')) {
    puts("Is null terminated.");
} else {
    puts("Is not");
}

2 个答案:

答案 0 :(得分:2)

strchr并不仅限于,甚至不知道您传递给它的数组的长度,因此会在整个内存中继续存在,直到它找到它的内容为止寻找。

如果您打印strchr返回的值,您会发现它超出了数组的末尾。

答案 1 :(得分:0)

char mark[4] = "mark";

以上这一行可分为两部分:

char mark[4];
sprintf(mark,"mark");

第一行在内存中保留4个字节,标记名称将返回第一个字节的地址。

第二行(相当于mark =" mark",但在执行期间写入)正在写字符串" mark"到内存,从名为mark的地址开始,这里的问题是你如何写一个字符串你将写入5个字节,所以你将写入保留给变量的4个字节中的4个字符AND将写入一个NULL(0x00) )到第5个字节,它不属于变量!

如果您在mark变量之后分配了另一个变量,那么在编写字符串时可能会损坏它,因为它会侵入此变量地址并覆盖它。