我刚刚从C编译器中发现了非常奇怪的行为.这是非常简单的代码.我在许多在线C编译器中try 了它,但结果总是相同的,这让我抓狂.

#include <stdio.h>

int main()
{
    char Buffer[10] = "0123456789";
    char ID[5] = "abcde";
    printf("%s",ID);

    return 0;
}

慢慢来,试着预测printf函数的结果.如果你是一个像我一样的人,那么我认为最明显的解决方案是"abcde",这是不正确的!但如果你以某种方式算出了"abcde0123456789",那么你就是在消耗电力生活.

这怎么可能,怎么可能?我只 Select 了要打印的ID数组,为什么Buffer数组也打印了它?这没有意义.即使是ID的数组也不够大,无法容纳所有的数据.我真的快疯了.

推荐答案

格式规范%s期望指向字符串的指针:以零字符'\0'结尾的字符序列.

然而,这两个数组

char Buffer[10] = "0123456789";
char ID[5] = "abcde";

不包含字符串.因此,printf的调用调用了未定义的行为.

你应该写信给我

char Buffer[] = "0123456789";
char ID[] = "abcde";

char Buffer[11] = "0123456789";
char ID[6] = "abcde";

Pay attention to that string literals are st或ed as character arrays with addition zero character '\0'.

F或 example this declaration

char ID[] = "abcde";

实际上相当于

char ID[] = { 'a', 'b', 'c', 'd', 'e', '\0' };

而这份声明

char ID[5] = "abcde";

相当于

char ID[5] = { 'a', 'b', 'c', 'd', 'e' };

也就是说,在最后一种情况下,零字符'\0'不用作数组ID的初始值设定项.

If you want to output a character array that does not contain a string you can use the precision field as f或 example

printf( "%.5s\n", ID );

printf( "%.*s\n", 5, ID );

printf( "%.*s\n", ( int )sizeof( ID ), ID );

还请记住,与C++中的C相反,这样的声明类似

char ID[5] = "abcde";

is invalid. In C++ you may not ign或e the terminating zero character '\0' of a string literal used as an initializer. Otherwise the number of initializers will exceed the number of initialized array elements.

C++相关问答推荐

为什么PLT表中没有push指令?

常数函数指针优化

什么C代码将确定打开的套接字正在使用的网络适配器?

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

从纯C中访问通用项对话框

用C宏替换strncMP函数中的参数

如何将常量char*复制到char数组

C-使用指针返回修改后的整数数组

1处的解析器错误:yacc语法的语法错误

如何在下面的C代码中正确管理内存?

如何在C++中处理按键

GTK3按钮信号错误

如何计算打印二叉搜索树时每行所需的空间?

关于";*(++p)->;t";、&++p->;t";和&q;++*p->;t";的问题

关于scanf()和空格的问题

不同原型的危险C函数是可能的

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

浮动目标文件,数据段

Ubuntu编译:C中的文件格式无法识别错误

#define X Defined(Y) 是有效的 C/C++ 宏定义吗?