我对这个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/

10-08 22:04