C 程序 NEWB:strcpy 缓冲区警告

C Program NEWB: strcpy buffer warning

(对不起,如果重复,找不到这个问题的简单答案) 学习如何形成结构并在使用 strcpy 时出现缓冲区警告。我在想我需要 malloc 来创建缓冲区 space?我认为定义数组就是这样做的。我向 strcpy 长度添加了 +1 以容纳字符串术语 /0... 但仍然收到警告。非常感谢您的帮助...

代码:

#include <string.h>
#include <stdio.h>

char id[9] = "123456789";
char fn[20] = "firstname";
char ln[20] = "lastname";
char bd[10] = "99/99/1900";
int h = 72;
int w = 215;

typedef struct PERSON {

    char ID[9];
    char firstName[20];
    char lastName[20];
    char birthDate[10];
    int height;
    int weight;
    int BMI;

}PERSON;

int main() {

    PERSON p1;

    strcpy_s(p1.ID, 10, id);
    strcpy_s(p1.firstName, 21, fn);
    strcpy_s(p1.lastName, 21, ln);
    strcpy_s(p1.birthDate, 11, bd);
    p1.height = h;
    p1.weight = w;
    p1.BMI = (p1.weight / (p1.height * p1.height) * 703);

    printf("ID: %s\nFirst Name: %s\nLast Name: %s\nBirth Date: %s\nHeight: %d\nWeight: %d\nBMI: %d\n", p1.ID, p1.firstName, p1.lastName, p1.birthDate, p1.height, p1.weight, p1.BMI);

    return 0;


}

输出:我的名字出现在 ID 行上,告诉我我有一些记忆问题?

ID: 123456789firstname
First Name: firstname
Last Name: lastname
Birth Date: 99/99/1900
Height: 72
Weight: 215
BMI: 0

C:\Users\.................ep.exe (process 56868) exited with code 0.
To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops.
Press any key to close this window . . .

如果我改变这个: strcpy_s(p1.ID, 10, id); 到: strcpy_s(p1.ID, 9, id); 代码不编译。我收到调试断言失败。缓冲区太小。强化我对记忆问题的看法。

不太熟悉malloc。我需要 malloc 结构中的所有数组吗? 感谢您的帮助!!

您有 9 个字符

"123456789";

您需要长度为 10 的数组来容纳 [=14=] 个字符。

char ID[10];
....

typedef struct PERSON {

char ID[10];