c - 重新分配二维字符数组

标签 c char multidimensional-array realloc

我有以下代码

 int wordLenght = 256, arrayLength = 2, i = 0, counter = 0;
 char **stringArray = NULL; 

 stringArray = calloc(arrayLength, sizeof(*stringArray));

 for(counter; counter<wordLenght; counter++) 
    stringArray[counter] = calloc(wordLenght, sizeof(stringArray));

 while(1)
 {
   printf("Input: ");
   fgets(stringArray[i], wordLenght, stdin);

   printf("stringArray[%d]: %s\n", i, stringArray[i]);

   if(i == arrayLength)
   {
     printf("Reallocation !!!\n");
     arrayLength *= 2;

     stringArray = realloc(stringArray, arrayLength*sizeof(*stringArray));

   } 

   i++;
 }    

我收到此重新分配错误:

*** glibc detected *** ./stringArray: realloc(): invalid next size: 0x0000000000b49010 ***
======= Backtrace: =========
/lib/libc.so.6(+0x775b6)[0x7f4dd12565b6]
/lib/libc.so.6(+0x7dd66)[0x7f4dd125cd66]
/lib/libc.so.6(realloc+0xf0)[0x7f4dd125d080]
./stringArray[0x4007f9]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f4dd11fdc4d]
./stringArray[0x400629]

我的问题是什么???

谢谢,问候

最佳答案

 stringArray = calloc(arrayLength, sizeof(*stringArray));

这里您可能想使用 sizeof(char*)

for(counter; counter<wordLenght; counter++) stringArray[counter] = calloc(wordLenght, sizeof(stringArray));

这里你循环了 256 次 (wordLenght),但你应该只循环 2 次 (arrayLength)。此外,您可能想使用 sizeof(char) 而不是 sizeof(stringArray)。

if(i == arrayLength) {...}

此检查应该在调用 fgets 之前完成,因为现在您首先使用内存,然后再分配它们。

此外,在重新分配 stringArray 后,您需要使用类似的方法分配其余字符串

for(counter = i; counter<arrayLength; counter++) stringArray[counter] = (char*)calloc(wordLenght, sizeof(char));

最后,您需要在退出应用程序之前释放所有分配的内存。

关于c - 重新分配二维字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3186284/

相关文章:

c++ - push_back on 2D std::vector< std::vector<char*>> value made all the values are the same

python - Python 中稀疏矩阵的矩阵乘法

javascript - 将值分配给数字索引多维数组 jquery

php - 在多维数组上使用 array_intersect

c - realloc 指针指向随机内存,导致程序崩溃

c - 指针和字符串?

c - 大小 1 的无效读取

将Matlab/C函数转换为无源代码版本

c - 递增字符指针

c - 如果 char 是一个字节,这怎么不是未定义的行为