我有一个名为PPString的类:
#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
#include "PPString.h"
char *PPString::pointerToCharString() {
return *stringValue;
}
void PPString::setCharString(char *charString[]) {
*stringValue = *charString;
}
void PPString::setCharString(const char charString[]) {
*stringValue = (char *)charString;
}
我正在尝试使用stringValue
设置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;
第一个使用const char
,但第二个使用char
,但是我得到了这个输出:
LOLZ
im entering a string now...
Bus error
第二行是我输入的内容,然后按下return
键。
任何人都可以帮我解决这个问题吗?感谢...
答案 0 :(得分:3)
带有char *s[]
签名的setCharString将取消引用指向char*
的指针数组的第一个元素。它尚未分配。如果您将aa
的声明更改为char aa[1000];
,则可能会运行。
还有一些其他问题(其他人也指出)。对变量stringValue
的赋值也是取消引用似乎没有分配的内存。很难说它的用途是什么,但它应该没有[]
声明。另外,赋值是存储一个指向堆栈内存的指针,在另一个函数调用之后它可能无效。
答案 1 :(得分:1)
当你说:
char *aa[1000];
std::cin >> *aa;
* aa没有分配内存。同样的问题在这里:
char *stringValue[];
名称__CPP_PPString
在C ++中保留,所有名称都包含双下划线或以下划线和大写字母开头。您不能在自己的代码中创建它们,
答案 2 :(得分:1)
char *aa[1000];
不是您认为的那样。这是一个1000 char *
的数组。
请改用std::string
。这样,您就不必担心有人输入超过1000个字符并利用您的程序。
E.g。
std::string input;
std::cin >> input;
答案 3 :(得分: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;