显然C不喜欢声明:
char some_array[n] = "Text here";
< ==其中 n 是一个合适大小的int ....
嗯,实际上,我想它很喜欢它,但输出让我感到惊讶!这是一个例子。
char two[4] = "What";
printf("2: %s \n", two);
输出是:
2: WhatWhat
什么是什么在那里做什么?!
所以我尝试添加:
char test[4] = "abcd";
输出是:
2: WhatWhatabcd
3: abcd
是的,我明白了,我的语法不受欢迎。但为什么?!实际的变量是怎么回事?
答案 0 :(得分:4)
字符串文字有一个额外的字符 - nul终结符。
所以你需要长度为5:
char two[5] = "What";
或者如果可能的话:
char two[] = "What";
(你得到一个缓冲区溢出或其他东西)
答案 1 :(得分:1)
在处理字符串时,您应该考虑使用null终止符。在这里,您尝试将4个字符的字符串文字分配给4个字符的数组,从而不为空终止符提供额外的字符空间。
更改代码如下:
char two[5] = "What";
char test[4] = "abcd";
至于为什么"What"
你遇到了问题并没有"abcd"
,behavior will be undefined这种情况,因为程序会尝试搜索内存直到null终结者被发现。在你的情况下,它打印不正确,它可能导致崩溃,挂起或上帝知道什么。
答案 2 :(得分:1)
字符串仅由NULL字符终止,在您的情况下,因为您已经分配了4个字节的空间,并且您正在将4个字符中的“what”存储在内,因此没有剩余空间用于NULL终止。
打印时printf开始从你提到的起始地址读取数据并直到NULL字符...所以分配缓冲区的相邻内存可能有一些垃圾字符(因为内存没有自动刷新,在所有情况下,当缓冲区被释放时,所以你看到了什么,或者它可能是什么,或者它可能是什么时候,甚至可能是一个分段错误,如果它去读取直到未经授权的内存位置。
答案 3 :(得分:1)
因为您的最大数组索引是4,所以您遇到了这个问题。
使最大数组索引为5,例如char test [5]使它可以用NULL终止字符串。你的问题将被排序。