【问题标题】:std::cin >> *aa results in a bus errorstd::cin >> *aa 导致总线错误
【发布时间】:2010-04-25 13:14:14
【问题描述】:

我有一个名为 PPString 的类:

PPString.h

#ifndef __CPP_PPString
#define __CPP_PPString

#include "PPObject.h"

class PPString : public PPObject {
    char *stringValue[];
public:
    char *pointerToCharString();
    void setCharString(char *charString[]);
    void setCharString(const char charString[]);
};

#endif

PPString.cpp

#include "PPString.h"

char *PPString::pointerToCharString() {
    return *stringValue;
}

void PPString::setCharString(char *charString[]) {
    *stringValue = *charString;
}

void PPString::setCharString(const char charString[]) {
    *stringValue = (char *)charString;
}

我正在尝试使用std::cin 设置stringValue

main.cpp

PPString myString;
myString.setCharString("LOLZ");
std::cout << myString.pointerToCharString() << std::endl;

char *aa[1000];
std::cin >> *aa;
myString.setCharString(aa);
std::cout << myString.pointerToCharString() << std::endl;

使用const char 的第一个有效,但使用char 的第二个无效,我得到以下输出:

从 STDOUT 复制和粘贴

LOLZ
im entering a string now...
Bus error

第二行是我输入的内容,然后按return 键。

谁能帮我解决这个问题?谢谢...

【问题讨论】:

  • 感谢描述性标题。它让人们无需阅读即可知道您的问题。

标签: c++ pointers char const-char bus-error


【解决方案1】:

带有char *s[] 签名的setCharString 正在取消引用指向char* 的指针数组的第一个元素。它没有被分配。如果将aa的声明改为char aa[1000];,它可能会运行。

还有一些其他问题(也被其他人指出)。对变量stringValue 的赋值也取消了似乎尚未分配的内存。很难说它的用法是什么,但它可能不应该有[] 声明。另外,这个赋值存储了一个指向栈内存的指针,在另一个函数调用之后可能会失效。

【讨论】:

  • ...直到有人输入 1005 个字符。
  • @Alex:我将其更改为char aastd::cin &gt;&gt; &amp;aamyString.setCharString(&amp;aa),并从函数声明中删除了星号。它现在可以在没有字符限制的情况下使用。
【解决方案2】:

当你说:

char *aa[1000];
std::cin >> *aa;

*aa 没有分配给它的内存。这里有同样的问题:

char *stringValue[];

并且名称__CPP_PPString 在 C++ 中是保留的,所有包含双下划线或以下划线和大写字母开头的名称也是如此。您不能在自己的代码中创建它们,

【讨论】:

    【解决方案3】:

    char *aa[1000]; 不是你想的那样。这是一个包含 1000 个 char * 的数组。

    请改用std::string。这样,您就不必担心有人输入超过 1000 个字符并利用您的程序。

    例如

    std::string input;
    std::cin >> input;
    

    【讨论】:

    • 这个问题,很快我就不再链接到标准库了。这些类实际上在我自己的静态库中。也许我现在可以使用 std::string 作为缓冲区。还是谢谢。
    • @Koning 你正在重写标准库?
    • @Kugel,不是真的。我正在编写一个链接到我的静态库的程序来测试它。那个静态库确实没有链接到任何东西。
    【解决方案4】:

    你用的是什么编译器?尝试使用其他编译器或为您正在使用的编译器启用所有警告,编译器应该会告诉您此代码的错误,您无需在运行时查找。

    例如,Comeau online 会告诉你:

    "ComeauTest.c", line 4: error: incomplete type is not allowed
          char *stringValue[];
                ^
    
    "ComeauTest.c", line 23: warning: variable "aa" is used before its value is set
      std::cin >> *aa;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 2017-04-17
      • 2013-02-01
      相关资源
      最近更新 更多