我编写了以下c ++代码:
int main() {
char *argv[4];
cin >> argv[0] >> argv[1] >> argv[2] >> argv[3];
cout << argv[0] << argv[1] << argv[2] << argv[3] << endl;
return 0;
}
这给了我一个分段错误11.但如果我用4个string
值初始化数组而不是用户输入然后打印,它就可以正常工作。
此外,如果我尝试以下内容:
int main() {
char *argv[4] = {"bg","demo","running","2"};
cout << argv[0] << argv[1] << argv[2] << argv[3] << endl;
cin >> argv[0] >> argv[1] >> argv[2] >> argv[3];
cout << argv[0] << argv[1] << argv[2] << argv[3] << endl;
return 0;
}
我收到公共汽车错误10.请告诉我我做错了什么。我没有看到任何非法的内存访问。
答案 0 :(得分:2)
argv[i]
的{{1}}只是指向无处的指针。
您需要为输入字符串写入准备/分配空间,并让char* argv[4];
指向。
以下方法:
固定长度
在堆栈处分配空间。快,但长度必须在编译时决定。
argv[i]
动态长度
空间在堆中。堆操作的内存分配较慢,但可以在运行时调整其长度。
#define STR_SIZE 260
char argv[4][STR_SIZE];
C ++方式
让char* argv[4];
for(int i = 0; i < 4; i++)
argv[i] = new char[can_be_decided_at_runtime];
为您处理分配。
std::string
答案 1 :(得分:0)
您应该使用std::string
而不是char*
,因为您正在编写C ++而不是C;如果您需要针对C函数从std::string
转换为char*
,则可以使用c_str()
方法。
在第一种情况下,您必须为字符串保留内存,如下所示:
int main()
{
char *argv[4];
//reserve 10 bytes for each char*
argv[0] = new char[10];
argv[1] = new char[10];
argv[2] = new char[10];
argv[3] = new char[10];
cin>>argv[0]>>argv[1]>>argv[2]>>argv[3];
cout<<argv[0]<<argv[1]<<argv[2]<<argv[3]<<endl;
//free each char* to prevent memory leaks
delete[] argv[0];
delete[] argv[1];
delete[] argv[2];
delete[] argv[3];
return 0;
}
要使用std::string
编写相同的代码,您将拥有以下内容:
int main()
{
std::string argv[4];
cin>>argv[0]>>argv[1]>>argv[2]>>argv[3];
cout<<argv[0]<<argv[1]<<argv[2]<<argv[3]<<endl;
return 0;
}
答案 2 :(得分:0)