0

我有一个名为 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;
}

我正在尝试设置stringValueusing std::cin

主文件

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;

第一个使用 aconst char作品,但第二个使用 achar没有,我得到以下输出:

从 STDOUT 复制和粘贴

LOLZ
im entering a string now...
Bus error

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

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

4

4 回答 4

3

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

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

于 2010-04-25T13:27:48.950 回答
1

当你说:

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

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

char *stringValue[];

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

于 2010-04-25T13:24:39.237 回答
1

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

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

例如

std::string input;
std::cin >> input;
于 2010-04-25T13:25:45.677 回答
0

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

例如,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;
于 2010-04-25T13:35:48.560 回答