我对这个C程序是如何运行的感到困惑。我只是试图使用一个结构来存储一些变量,然后能够在一个单独的函数中打印出来。下面是我的代码。我不明白的是为什么我的第一个输出同时包含ip和密钥,而不仅仅是ip。
#include <stdio.h>
struct device {
char ip[6];
char key[5];
};
void check(struct device cred);
int main ()
{
int i;
struct device cred[10];
strcpy(cred[0].ip, "192.16");
strcpy(cred[0].key, "45EA9");
check(cred[0]);
return 0;
}
void check(struct device cred)
{
printf("IP: %s\n", cred.ip);
printf("Key: %s\n", cred.key);
}
Output:
IP: 192.1645EA9
Key: 45EA9
最佳答案
strcpy(cred[0].ip, "192.16");
是未定义的行为。目标没有足够的空间容纳
\0
。因此,它将其写入数组边界之外,从而产生UB。key
也有同样的问题。由于上述原因,使用
%s
格式说明符打印它现在也将是未定义的行为。printf
尝试从传递给它的参数所指向的地址开始打印字符-但它在数组中找不到\0
,因此它读取的字符超出了未定义行为的数组。必须使数组大小足够容纳字符串文本的字符,包括以
char
结尾的nul。关于c - C语言中的printf问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48997297/