【问题标题】:segmentation fault in a simple command line program简单命令行程序中的分段错误
【发布时间】:2014-02-28 13:37:00
【问题描述】:

我正在尝试创建一个简单的程序,该程序在作为命令参数输入的文件位置上使用 system() 调用 cat。但是每次调用文件时都会遇到分段错误(核心转储)。您能否检查一下原因(我在程序中的任何地方都看不到我正在用内存做一些事情来得到这个错误!)。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        printf("usage: %s filename", argv[0]);
    }
    else
    {
        printf("commad: %s", strcat("cat ", argv[1]));
        system(strcat("cat ", argv[1]));
    }
    return 0;
}

【问题讨论】:

  • 修改字符串文字是未定义的行为。
  • 你能解释一下吗
  • @MohamedAliJamaoui 您需要为 strcat 提供目标缓冲区

标签: c++ c segmentation-fault


【解决方案1】:

您不能修改字符串文字,例如"cat ",它们通常在加载可执行文件时存储在内存中的只读段中,当您尝试修改它时,您将得到您要求解释的分段错误关于。

考虑改用std::string,这是更惯用的 C++ 方式:

#include <stdlib.h>
#include <stdio.h>

#include <string>

int main(int argc, char *argv[]) {    
    if(argc != 2) {
        printf("usage: %s filename", argv[0]);
        return 0;
    } else {
        std::string command("cat ");
        command += argv[1];
        printf("command: %s", command.c_str());
        return system(command.c_str());
    }
}

std::string 对象将根据需要动态分配内存以容纳您添加到其中的其他字符。但是,如果您希望继续使用 C 字符串,则需要显式管理字符缓冲区:

char *buffer = static_cast<char*>(malloc(5 + strlen(argv[1])));
strcpy(buffer, "cat ");
strcat(buffer, argv[1]);
printf("command: %s", buffer);
// ...
free(buffer); 

【讨论】:

    【解决方案2】:

    在您的strcat 调用中,您尝试修改字符串文字“cat”,这是未定义的行为。 strcat 的第一个参数应该是一个可以写入的缓冲区,而不是字符串字面量。

    【讨论】:

      【解决方案3】:

      您使用 strcat 不正确。您需要提供一个目标缓冲区。

      #include <stdlib.h>
      #include <stdio.h>
      #include <string.h>
      
      int main(int argc, char *argv[])
      {
              if(argc == 2) {
                   char[20] c = "cat";
                   strcat(c, argv[1]);
                   printf("commad: %s", c);
                   system(c);
              }
              else {
                  printf("usage: %s filename", argv[0]);
              }
      
              return 0;
      }
      

      或者不要连接

      printf("commad: %s%s", "cat ", argv[1]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        • 1970-01-01
        • 2013-04-11
        • 1970-01-01
        相关资源
        最近更新 更多