memcpy(),更改预定义变量值时的分割错误

memcpy(), segmentation fault when changing the value of a predefined variable

本文关键字:变量值 分割 错误 预定义 memcpy      更新时间:2023-10-16

我写了一个处理命令行输入的程序。当使用长字符串作为输入时,我在 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;

input文件名的预定义大小等于 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,作为缓冲区

除此之外数组的大小

char inputFileName[] = "sequence.txt"; 

已修复且等于 13,您的代码有另一个错误。当你执行内存时

memcpy(inputFileName,string(argv[i+1]).c_str(),string(argv[i+1]).size());

然后,您不会复制终止零,因为表达式string(argv[i+1]).size()不考虑它。