[英]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.