总线错误10 - char *数组[重复]

问题描述 投票:1回答: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.请告诉我我做错了什么。我没有看到任何非法的内存访问。

c++ segmentation-fault bus
3个回答
2
投票

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.

0
投票

编辑: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 *


0
投票

您应该使用std::string而不是char*,因为您正在编写C ++而不是C;如果你需要从c_str()转换为std::string用于C函数,你可以使用char*方法。

在第一种情况下,你必须为你的字符串保留内存,如下所示:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.