问题描述
我遇到了内存冲突问题,如果到达 else if(argc == 2)
我正在尝试编写一个不错的脚本,没有类似的错误,其他任何东西都像魅力一样......
//...
// POWER ON
if(strcmp(argv[2],"on") == 0)
{
// GPIO On
pin_on();
// Open the serial port READ-WRITE
int serial_port = open("/dev/ttyS5",O_RDWR);
// Load serial port settings
settings(serial_port);
// POWER ON Message
unsigned char msg[] = { '\x2A','\x20','\x30','\x49','\x52','\x31','\x0D' };
// Send message to device
write(serial_port,msg,sizeof(msg));
// Time for device to process
std::system("sleep 0.25");
// Close the serial port
close(serial_port);
// GPIO Off
pin_off();
return 0; // success
}
// POWER OFF
else if(strcmp(argv[2],"off") == 0)
{
// GPIO On
pin_on();
// Open the serial port READ-WRITE
int serial_port = open("/dev/ttyS5",O_RDWR);
// Load serial port settings
settings(serial_port);
// POWER OFF Message
unsigned char msg[] = { '\x2A','\x32',sizeof(msg));
// Time for device to process
std::system("sleep 0.25");
// Close the serial port
close(serial_port);
// GPIO Off
pin_off();
return 0; // success
}
else if(argc == 2)
{
std::cout << "No argument passed!" << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
else if(argc > 3)
{
std::cout << "Too many arguments passed!" << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
else
{
std::cout << "Wrong argument! Passed: " << std::string(argv[2]) << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
//...
编辑:除了 argc 和 argv[] 值程序没有分配任何变量
编辑 2.:程序由 2 个参数操作和 3 个参数操作构成,就像我发布的代码中提到的那样。
解决方法
如果这个条件
else if(argc == 2)
求值为真,则表示 argv[argc]
等于 nullptr
。因此,在这种情况下,例如在调用 argv[2]
时使用表达式 strcmp
(即空指针)会导致未定义的行为。索引的有效范围是 [0,1]
。
来自 C++ 14 标准(3.6.1 Main 函数)
- ...如果 argc 非零,这些参数应在 argv[0] 中提供 通过 argv[argc-1] 作为指向初始字符的指针 以空字符结尾的多字节字符串 (ntmbs) (17.5.2.1.4.2) 和 argv[0] 应是指向 ntmbs 的初始字符的指针 表示用于调用程序的名称或“”。的价值 argc 应为非负数。 argv[argc] 的值为 0。
我遵循了@Yksisarvinen 的建议并对代码重新排序,现在它完美无缺:
//...
if(argc == 3)
{
// POWER ON
if(strcmp(argv[2],"on") == 0)
{
// GPIO On
pin_on();
// Open the serial port READ-WRITE
int serial_port = open("/dev/ttyS5",O_RDWR);
// Load serial port settings
settings(serial_port);
// POWER ON Message
unsigned char msg[] = { '\x2A','\x20','\x30','\x49','\x52','\x31','\x0D' };
// Send message to device
write(serial_port,msg,sizeof(msg));
// Time for device to process
std::system("sleep 0.25");
// Close the serial port
close(serial_port);
// GPIO Off
pin_off();
return 0; // success
}
// POWER OFF
else if(strcmp(argv[2],"off") == 0)
{
// GPIO On
pin_on();
// Open the serial port READ-WRITE
int serial_port = open("/dev/ttyS5",O_RDWR);
// Load serial port settings
settings(serial_port);
// POWER OFF Message
unsigned char msg[] = { '\x2A','\x32',sizeof(msg));
// Time for device to process
std::system("sleep 0.25");
// Close the serial port
close(serial_port);
// GPIO Off
pin_off();
return 0; // success
}
else
{
std::cout << "Wrong argument! Passed: " << std::string(argv[2]) << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
}
else if(argc == 2)
{
std::cout << "No argument passed!" << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
else
{
std::cout << "Too many arguments passed!" << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
//...