C++编译 strlen 和 strcpy 的问题

C++ compile problem with strlen and strcpy

本文关键字:问题 strcpy 编译 strlen C++      更新时间:2023-10-16
#include<iostream>
using namespace std;
int main()
{
char a[5],b[5];
cout<<strlen(a)<<endl;
strcpy(a,b);
}
当我使用g++ filename.cpp

编译代码时,代码将被编译没有问题,但是当我的朋友尝试使用 dev-c++ 执行此操作时,他们会收到错误!

基于 cplusplus.com,我是应该出错的人!!

所以我只是想知道是什么导致了这里的差异?

PS:我已经尝试了不同版本的C++使用-std=c++98投掷-std=c++2a

strlenstrcpy<cstring>标头中声明。 一些标准库实现可能包含在<iostream>中,有些可能没有。 这就解释了为什么它可以使用某些设置而不是其他设置进行编译。

char a[5],b[5];
cout<<strlen(a)<<endl;
strcpy(a,b);

ab都是未初始化的。程序具有未定义的行为。编译器没有义务生成任何特定内容。任何行为都是可以接受的。不能使用 UB 对代码进行推理。该程序只是无效/损坏(编译器也没有义务警告您有关UB btw的信息(。

至于编译失败:您没有包含定义strcpystrlen的标头。那是在<cstring>.包括该标头,代码应该编译(它仍然会被破坏,但它应该编译(。

标准库标头(如iostream(允许包含其他标头,但不是必需的。因此,在某些系统上,您可能可以不包含标头,因为其他一些系统会为您拉入标头。但这并不能保证,你不应该依赖它。始终明确包含您需要/使用的内容的标题。