This question already has answers here:
Crash or “segmentation fault” when data is copied/scanned/read to an uninitialized pointer

(5个答案)


3年前关闭。




我编写以下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。请告诉我我做错了什么。我没有看到任何非法的内存访问。

最佳答案

argv[i]char* argv[4];只是指向无处的指针。

您需要准备/分配用于输入字符串写入的空间,并让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.

关于c++ - 总线错误10-字符*数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42199657/

10-11 04:42