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];
(对不起,如果重复,找不到这个问题的简单答案) 学习如何形成结构并在使用 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];