总线错误 10 - 字符 * 数组
bus error 10 - char * array
我编写以下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。请告诉我我做错了什么。我没有看到任何非法的内存访问。
char* argv[4];
的argv[i]
只是一个指向无处的指针。
您需要准备/分配输入字符串写入的空间,并让argv[i]
指向。
方法如下:
固定长度
空间在堆栈中分配。速度快,但长度必须在编译时决定。
#define STR_SIZE 260
char argv[4][STR_SIZE];
动态长度
空间在堆中。堆操作上的内存分配速度较慢,但其长度可以在运行时进行调整。
char* argv[4];
for(int i = 0; i < 4; i++)
argv[i] = new char[can_be_decided_at_runtime];
C++方式
让std::string
为您处理分配。
std::string argv[4];
// Then use argv[i].c_str(); to get inner const char* pointer.
编辑: Ty Barmar
char *argv[4];
此 argv 字符当前指向不在应用程序范围内的地址。
您必须将每个 argv 初始化为给定长度
for (int i = 0; i < 4; i++)
argv[i] = new char[2];
但请记住,您确实必须确保要写入控制台的每个参数的长度。
new char[2]
仅当您键入时才足够
a b c d
进入控制台!
否则,您将不得不编写一个处理无限输入长度的函数。另一种方法是使用 std::string 的 .c_str(( 方法,该方法返回 const char*
你可能
应该使用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;
}
相关文章:
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 按字符值访问int数组
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- C++ 带结构的数组字符
- 数组字符包含量超出预期
- 读取文件并添加到数组字符
- 如何在Qt中更改或替换数组字符
- 为什么编译器不在参数中传递数组字符 *arr[] 的大小?
- 井字棋数组字符错误
- 分割数组字符