#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class STRING {
private:
char *S[10];
public:
STRING();
void set_str(int n, const char* str1);
char* get_str(int n);
};
STRING :: STRING(){
for (int i=0; (i < 9); i ++ ){
S[i] = '\0';
cout << S[i];
}
}
void STRING :: set_str(int n,const char*str1) {
S[n] = (char*)malloc(strlen(str1 + 1));
strcpy(S[n], str1);
cout << S[n];
}
char* STRING :: get_str(int n){
return S[n];
}
int main () {
cout << " Init \n";
STRING* str = new STRING();
cout << "Error \n";
return 0;
这个程序成功编译,运行,但是当它运行时它只能在对象 STRING * str = new STRING(); 的实体化之前工作。所以我在这种情况下看不到错误消息。有人能指出我的错误吗? 如果有更好的方法来初始化字符串数组,我很乐意知道。
我的目标是初始化蜇伤阵列。并且最初将整个数组的值设置为NULL。 此致
答案 0 :(得分:2)
假设STRING表示“10个字符串的集合”,那么它就是你的构造函数。您正在设置指向字符'\ 0'的值的指针,而不是指向空指针。您正在为char *类型指定char类型。现在这可能有效,但是你有cout声明。它试图对指针进行DEREFERENCE。但是指针指向内存中的任何位置'\ 0',而不是那时的空字符。
编辑:在回答OP的问题时,我认为应该如何初始化为10个空char数组。您的构造函数将更改为:
STRING :: STRING(){
for (int i=0; i < 10; i ++ ){ // changed to 10. 9 would miss the 10th element
S[i] = new char[1]; // Length-1 char array
S[i][0] = 0; // or '/0' or whatever
cout << S[i]; // Prints nothing
}
}
你还需要一个析构函数来释放内存:
STRING :: STRING〜() { for(int i = 0; i&lt; 10; i ++){ 删除[] S [i]; }
并将“set”方法更改为使用“new”而不是“malloc”。或者malloc和free的一切。但不要混淆它们。并记住使用“数组删除”而不仅仅是删除。
和FTLOG一样,转到书签this link。使用内置字符串类。
答案 1 :(得分:0)
该成员的正确声明应为:
char S[10];
你拥有它的方式
char *S[10];
声明一个10 char *
的数组。所以当你执行S[i] = '\0';
时,你正在初始化S[i]
,这是一个指向char
的指针,到'\0'
,这可能是NULL,所以你基本上都在调用cout << NULL
在下一行。