-4

如果我创建一个一定大小的字符指针数组,例如:

 char* temp[10];
//need intialisation here..
temp[0] = "BLAH";
temp[1] = "BLAH";
temp[3] = "BLAH";
.
.
.
temp[9] = "BLAH";    
//Need reinitialise..
temp[10] = "BLAH";
temp[11] = "BLAH";
  1. 我该如何初始化它?

  2. 一段时间后如何用大小 20 重新初始化它?

  3. malloc()这样做有用吗calloc()?如果是,那么如何使用指向字符的指针数组?

[编辑]

我的代码和要求,基本上我想用c读取文件但不浪费单个字符......这是从文本文件中读取数据的代码,

FILE *ptr_file;
/* Allocate space for ten strings */
/* Allocate space for ten strings */
char** list  = (char **)malloc(10 * sizeof(char));

/* Reallocate so there's now space for 20 strings */                    

/* And initialize the new entries */

ptr_file =fopen(LogFileCharName,"rb");
if (!ptr_file)
    return 1;
int __index = 0;
wchar_t CurrentString[1000];
while(fgetws (CurrentString , 1000 , ptr_file) != NULL)
{
    char* errorDes;
    errorDes = new char[1000];
    wcstombs(errorDes, CurrentString, 1000);
    list[__index] = errorDes;
    if( __index>10)
      {
             (char**)realloc(list, 20 * sizeof(char *));
     }
    __index++;
}

现在当大小超过 10 时,只需要调整大小即可。为此,我使用的是 Microsoft Visual Studio 的 Win32 控制台应用程序类型。

4

1 回答 1

2

您不使用数组,而是使用指针并在堆上分配,然后在需要时重新分配:

/* Allocate space for ten strings */
char **temp = malloc(10 * sizeof(char *));

temp[0] = "Hello 1";
/* ... */
temp[9] = "Hello 10";

/* Reallocate so there's now space for 20 strings */
temp = realloc(temp, 20 * sizeof(char *));

/* And initialize the new entries */
temp[10] = "Hello 11";

至于初始化,这取决于字符串的内容是什么。要么让它指向一个已经存在的字符串(或者像我上面的例子中的字符串文字,或者其他字符串),要么你也为堆上的字符串分配空间。

也许是这样的:

for (int i = 0; i < 10; i++)
{
    char temp_string[10];

    /* Create strings in the form "Hello 1" to "Hello 10" */
    sprintf(temp_string, "Hello %d", i + 1);

    /* Duplicate the temporary string */
    temp[i] = strdup(temp_string);
}

注意:如果您使用 egstrdupmalloc/calloc来分配实际的字符串,您当然也必须使用free它们。


在您更新问题后,我发现您的代码存在一些问题:

  • 首先是当进行检查时,__index>10您已经有两个索引超出了数组的范围。支票应该是__index==9
  • 进行上述更改还将解决您的另一个问题,即一旦索引达到 11 或更高,您将不断重新分配。
  • 由于您new用于数组中的实际字符串,因此必须delete在释放实际字符串时使用。
  • 由于您使用new,因此您使用的是 C++,有更好的工具来处理这样的事情:

    // Declare and open file
    wifstream ifs(LogFileCharName);
    
    std::vector<std::string> list;
    
    std::wstring CurrentString;
    
    while (std::getline(ifs, CurrentString))
    {
        // Get the needed length of the destination string
        size_t length = wcstombs(nullptr, CurrentString.c_str(), 0);
        char* tmp = new char[length + 1];
    
        // Do the actual conversion
        wcstombs(tmp, CurrentString.c_str(), length + 1);
    
        // Add to list
        list.emplace_back(tmp);
    
        delete [] tmp;
    }
    
于 2013-05-08T06:05:52.923 回答