我有一个基本的C编程问题,这是情况.如果我正在创建一个字符数组,并且如果我想使用%s转换代码将该数组视为字符串,我是否必须包含空零.例:
char name[6] = {'a','b','c','d','e','f'};
printf("%s",name);
Run Code Online (Sandbox Code Playgroud)
控制台输出为:
abcdef
Run Code Online (Sandbox Code Playgroud)
请注意,数组中的最后一个元素没有空零,但我仍然将其打印为字符串.
我是编程的新手...所以我正在读一本初学者C书,其中指出,由于我在最后一个元素中没有使用空零,所以我不能将它视为字符串.
这是与上面相同的输出,尽管我包含零零.
char name[7] = {'a','b','c','d','e','f','\0'};
printf("%s",name);
Run Code Online (Sandbox Code Playgroud)
你只是幸运; 可能在该数组结束后,在堆栈上,有一个零,所以printf在最后一个字符后停止读取.如果您的程序非常短并且堆栈区域仍然是"尚未开发" - 即堆栈尚未增长到那一点 - 它很容易归零 - 因为通常现代操作系统会将最初归零的页面提供给应用程序.
更正式地说:由于没有明确的NUL终结者,你将进入未定义行为的土地,这意味着任何事情都可能发生; 这样的事情也可能是你的程序工作正常,但它只是运气 - 而且它是最糟糕的类型的bug,因为如果它通常工作正常,很难发现.
TL; DR版本:不要这样做.坚持保证工作,你不会在你的应用程序中引入偷偷摸摸的错误.