为什么第一个数组的整体被添加到第二个数组中,除了我指定的两个值(从第一个)开始?

时间:2015-05-19 00:51:19

标签: c arrays

我想将哈希数组中的前两个值分配给salt数组。

char hash[] = {"HAodcdZseTJTc"};   
char salt[] = {hash[0], hash[1]};

printf("%s", salt);

然而,当我尝试这个时,前两个值被分配,然后所有十三个值也被分配给salt数组。所以我的输出不是:

HA

但是:

HAHAodcdZseTJTC

2 个答案:

答案 0 :(得分:3)

salt不会以空值终止。尝试:

char salt[] = {hash[0], hash[1], '\0'};

答案 1 :(得分:2)

由于您只向v.type数组添加两个字符,而您没有添加salt终止符。

将非'\0'终止的数组作为参数传递给带有nul说明符的printf(),会导致未定义的行为,在您的情况下,它会在我的情况下打印"%s"

hash

被打印出来。

c中的字符串使用特殊的对话来知道它们的结束位置,在非HA@ 字节序列的末尾附加了一个不可打印的特殊字符'\0',并且如何构建交流字符串。

例如,如果您要计算字符串的长度,则可以执行类似

的操作
'\0'

当然有更好的方法,但我只是想说明终止size_t stringlength(const char *string) { size_t length; for (length = 0 ; string[length] != '\0' ; ++length); return length; } 的重要性。

既然你知道这一点,你应该注意到

'\0'

char string[] = {'A', 'B', 'C'}; 的数组,但不是字符串,因为它是字符串,需要终止char,所以

'\0'

实际上是一个字符串。

请注意,当您分配空间来存储char string[] = {'A', 'B', 'C', '\0'}; 个字符时,您需要分配n个字节,以便为n + 1腾出空间。

'\0'的情况下,它将尝试使用传递指针指向的所有字节,直到其中一个为printf(),在那里它将停止迭代字节。

这也解释了未定义行为的事情,因为显然'\0'会读出界限,任何事情都可能发生,这取决于内存地址实际上是什么不属于传递的数据但是不在界限。

标准库中有许多函数需要字符串,即非printf()字节的_sequences,后跟nul字节。