为什么以下代码会产生分段错误?

时间:2013-11-05 06:17:13

标签: c++ unix segmentation-fault strtok

我正在尝试通过我的程序执行UNIX命令,该命令最多可处理4个参数,为什么会产生seg错误或其他错误?

using namespace std;

int main() {

char buffer[255];
cin >> buffer;


char* firstPtr;
char* secondPtr;
char* thirdPtr;
char* fourthPtr;

firstPtr = strtok(buffer, " ");
secondPtr = strtok(NULL, " ");
thirdPtr = strtok(NULL, " ");
fourthPtr = strtok(NULL, " ");


execlp(firstPtr, secondPtr);


   return 0;
}

3 个答案:

答案 0 :(得分:2)

崩溃是因为buffer溢出。

尝试使用std::cin.getline(buffer, sizeof(buffer))代替std::cin >> buffer
另请注意,strtok可能会返回NULL,因此请务必处理它。

答案 1 :(得分:1)

我认为你应该使用

char buffer[255];
cin.getline(buffer, 255);

否则你的第二,第三和第四指针将为空。

答案 2 :(得分:1)

如果您检查execlp的{​​{3}},您会注意到第一个参数(方法的第二个参数,arg0参数)是必需的,另外您可以通过可变参数传递给函数的任何其他参数 - 并且在文本中也提到了

  

参数列表必须以NULL指针终止。

第一个参数(在你的情况下是secondPtr)应该是可执行文件的名称;所以你通过在这里传递NULL来违反惯例(因为其他人已经指出了cin >>)。

但另外,你最后还缺少至少一个需要NULL的参数。

因此,强烈建议对手册页进行研究!