c++ - 使用 argv[1] 时出现分段错误
问题描述
当我尝试使用以下命令运行该程序时:./prog_name eventCNT 我遇到分段错误错误,而使用其他参数时一切正常...
int main(int argc, char *argv[]) {
printf("Application for up/down/random counter on 7 seg display\n");
if ( (strcmp(argv[1], "eventCNT") == 0 && argc != 2) || (strcmp(argv[1], "eventCNT") != 0 && argc != 3) )
{
printf( "usage: %s <direction or event counting> <delay>\n", argv[0] );
printf( "valid direction : up, down, updown, random\n");
printf( "valid event counting : eventCNT\n");
printf ("recommended delay range in ms : 0 to 1000\n");
}
else
{
.
.
.
}
}
解决方案
您应该argc
在访问之前检查argv
如果argc == 1
并且您argv[1]
首先访问,则您正在访问无效内存,因为argv
只有一个成员,即argv[0]
C++ 从左到右评估语句,因此首先具有未定义的行为,然后检查是否可以这样做不是最好的方法。将检查反转为argc
和argv
实际上,您应该以更具防御性的方式编写代码,例如
if (argc < 2)
{
// Error, not enough arguments
return -1
}
// From here you know that argv[1] will be a valid string to something and you can freely get `argv[1]`
推荐阅读
- monitor - HTC Vive 作为第二台显示器
- c# - Xamarin.Forms iOS Picker 在关闭对话框后跳转到最后一项
- php - 如何在结束 head 标签之前加载多个 css 文件?
- ruby - 无法在 ubuntu vps 上通过 rbenv 安装 ruby 2.5.1
- c++ - Visual Studio 2019 上 Vcpkg 的 Boost.Tests vc142
- vba - DBF 文件不是有效的路径 - VBA
- sql - 用连接计数
- entity-framework-core - 如何找到导航属性的外键字段?
- python-3.x - 按数据框分组的多列排序
- java - 从数据库中删除数据后如何刷新我的活动(使用 DAO)