【发布时间】:2019-04-02 14:19:22
【问题描述】:
我正在处理一些 C 示例,并使用函数 strcpy(),但忘记包含 <string.h>,尽管我已包含 <stdio.h>。令我惊讶的是,代码运行成功。以下是我正在执行的代码:
#include <stdio.h>
int main() {
char message[10];
int count, i;
strcpy(message, "Hello, world!");
printf("Repeat how many times? ");
scanf("%d", &count);
for(i=0; i < count; i++) {
printf("%3d - %s\n", i, message);
}
}
我正在使用gcc version 3.3.6 (Ubuntu 1:3.3.6 - 15ubuntu1)
我什至没有收到任何编译警告。
为什么我的代码不包含<string.h> 也能正常工作?
提前致谢。
【问题讨论】:
-
未定义的行为就是这样。你不会总是那么幸运,编译器警告应该被认真对待。
-
@AbhayKumar 尝试使用
-Wall -Wextra启用警告。 -
是否确定行为未定义,@WeatherVane?如果该实现的
stdio.h包含string.h(似是而非,但不能保证)怎么办? -
把旋钮调到 11。 C4013: 'strcpy' undefined;假设 extern 返回 int。
-
strcpy(message, "Hello, world!");肯定是缓冲区溢出