c++ - 简单命令行程序中的段错误

标签 c++ c segmentation-fault

我正在尝试创建一个简单的程序,该程序在作为命令参数输入的文件位置上使用 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;
}

最佳答案

你不能修改字符串字面量,例如"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); 

关于c++ - 简单命令行程序中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22096693/

相关文章:

c++ - 如何在写入图标 (.ico) 时为鼠标光标应用掩码

c++访问 map 时发生访问冲突

c++ - 共享库无法访问程序的内存

c - GCD,迭代和递归问题

c - 程序在等待退出时超时

c++ - gdb中<exp+6>是什么意思?

c - 在 C 中循环遍历字符串会出现段错误(核心已转储)

c++ - afxdb.h 错误?

将 char * 附加到 char ** 的 C realloc 段错误

c - UWP - 刷新 ListView 和 CollectionViewSource