初始化和调整字符指针数组的大小

时间:2013-05-08 06:02:58

标签: c

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

 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()对此有用吗?如果是,那么如何使用指向字符的指针数组?

  4. [EDITED]

    我的代码和要求, 基本上我想在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时,只需调整大小即可。 为此我使用的是win32控制台应用程序类型的microsoft visual studio。

1 个答案:

答案 0 :(得分: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);
}

注意:如果您使用例如strdupmalloc / 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;
    }