-1
#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();初始化之前工作。. 所以在这种情况下我看不到错误消息。有人可以指出我的错误吗?如果有更好的方法来初始化字符串数组,我很高兴知道。

我的目标是初始化 tha 数组。并且最初将整个数组的值设置为 NULL。问候

4

2 回答 2

2

假设 STRING 的意思是“10 个字符串的集合”,那么它就是你的构造函数。您将指针设置为字符 '\0' 的值,而不是空指针。您正在将 char 类型分配给 char* 类型。现在这可能有效,但是你有 cout 声明。它试图 DEREFERENCE 指针。但是指针指向内存 '\0' 中的任何位置,而不是此时的空字符。

编辑:针对 OP 的问题,我认为应该如何初始化 10 个空字符数组。您的构造函数将更改为:

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 < 10; i++) { delete [] S[i]; }

并将您的“set”方法更改为使用“new”而不是“malloc”。或所有 malloc 和免费的东西。但不要混合它们。并记住使用“数组删除”而不仅仅是删除。

和 FTLOG,转到并收藏此链接。使用内置的字符串类。

于 2012-04-09T21:57:05.887 回答
0

成员的正确声明应该是:

 char S[10];   

你拥有它的方式

 char *S[10];

声明一个 10 的数组char *。因此,当您这样做时S[i] = '\0';,您正在初始化S[i],它是指向 a char、 to的指针'\0',它可能为 NULL,因此您基本上cout << NULL是在下一行调用。

于 2012-04-09T21:54:48.850 回答