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;
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()
不考虑它。
相关文章:
- 使用变量值作为 PlaySound 中的路径
- 通过指针偏移量访问结构变量值
- 变量值在 C++ 中的 glutIdleFunc() 中未递增
- 更新 #ifdef 中的现有变量值?
- 尝试更改 main 函数内的全局变量值时出现编译错误 C++.
- 通过 Rcpp 和 bit64 R 包将最大的int64_t变量值从 C++ 传递到 R
- 如何使用 IRBuilder 更新 LLVM IR 中的全局变量值?
- 更改已在运行的程序的变量值
- 在 Xcode 中使用后对外部变量值进行初始化
- C++整数变量值
- 变量值,在三元运算符之后
- 如何获得对不同类的引用,以便从所述类内部获得变量值
- Java应用程序的JNI-c++变量值
- 如何固定从传感器获得的变量值
- 离开方法时重置变量值
- 打印具有通用特定变量值的类对象
- 在宏函数C++中设置宏变量值
- 为什么每次迭代都会获得相同的变量值? C++
- 如何根据基类对象中的变量值分配派生类中的变量?
- memcpy(),更改预定义变量值时的分割错误