如果我创建一个大小如下的字符指针数组,如:
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";
如何初始化它?
如何在一段时间后使用20号重新初始化它?
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时,只需调整大小即可。 为此我使用的是win32控制台应用程序类型的microsoft visual studio。
答案 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);
}
注意:如果您使用例如strdup
或malloc
/ calloc
分配实际字符串,您当然也必须free
。
在您更新了问题之后,我发现您的代码存在一些问题:
__index>10
时,你已经有两个超出数组范围的索引了。检查应为__index==9
。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;
}