c++ - memcpy(),更改预定义变量的值时出现段错误

标签 c++ segmentation-fault memcpy

我写了一个程序来处理命令行输入。当长字符串用作输入时,我在 memcpy() 函数期间遇到段错误。

代码如下:

int main(int argc, char * argv[])
{
    // initialize input variables
    char inputFileName[] = "sequence.txt"; //default input file name
    //check if a different file name is given
    for(int i = 0; i < argc-1; i++){ 
        if(string(argv[i])=="-i"){ 
            cerr << "string: " << string(argv[i+1]).c_str() << endl;
            cerr << "string size: " << string(argv[i+1]).size() << endl;
            inputFileName[string(argv[i+1]).size()]=0;
            cerr << "filename: " << inputFileName << endl;
            memcpy(inputFileName,string(argv[i+1]).c_str(),string(argv[i+1]).size());
            cerr << "filename after memcpy: " << inputFileName << endl;
            break;
        }
    }
}

当给定一个短文件名时(-i sequence.fasta)它可以正常工作:

$ ./Program -i sequence.fasta

string: sequence.fasta
string size: 14
filename: sequence.txt
filename after memcpy: sequence.fasta
filename final: sequence.fasta

但是长名称会导致段错误:

$ ./Program -i sequencesequencesequencesequencesequencesequencesequencesequencesequencesequence.fasta

string: sequencesequencesequencesequencesequencesequencesequencesequencesequencesequence.fasta
string size: 86
filename: sequence.txt
Segmentation fault: 11

我错过了什么吗?我应该如何处理 memcpy()?

最佳答案

这是你的问题:

  inputFileName[string(argv[i+1]).size()]=0;

inputFileName 的预定义大小等于 strlen("sequence.txt") + 1 == 12bytes + 1byte for '\0'

  char inputFileName[] = "sequence.txt"; //default input file name

因此,如果您使用 string(argv[i+1]).size() 对其进行索引,则如果 argv[i+1] 长于 13,则行为未定义。

你应该使用 std::string 作为缓冲区

关于c++ - memcpy(),更改预定义变量的值时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20957288/

相关文章:

c++ - 查找节点崩溃的函数

c - fprintf 段错误

c - 取消引用 char 指针会导致段错误

c - 堆栈内存上的 Memcpy

c - 是否保证执行 memcpy(0,0,0) 是安全的?

c++ - 使用 Qt 中的命名参数列表发出 HTTP POST 请求

c++ - 如何将一个模板类隐式转换为另一个模板类?

C++ 编译时类型检查

c++ - boost 信号量导致段错误

c - 尝试使用 C 将结构复制到 fifo 时出现问题