簡體   English   中英

memcpy(),更改預定義變量的值時出現分段錯誤

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

我編寫了一個用於處理命令行輸入的程序。 當長字符串用作輸入時,在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具有預定義的大小,等於'\\ 0'的strlen(“ sequence.txt”)+ 1 == 12bytes + 1byte

  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

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

那么您就不會復制終止零,因為表達式string(argv[i+1]).size()不會考慮該零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM