【问题标题】:C char**** array dynamicly allocated behaving awkwardC char**** 数组动态分配行为尴尬
【发布时间】:2014-02-19 09:57:06
【问题描述】:

大约 20 个小时过去了,我仍然不知道是什么问题。

首先是带有这些参数的main函数。

  char ***matrix;
  int line, maxCollumn, i, j;
  int lineData[100];

然后我调用函数

PutFirstAndLast(&matrix, &line, &maxCollumn, lineData);

此函数旨在动态分配我的矩阵并返回其行数和列数。 lineData 用于存储我在每行上有多少项目,因为稍后在函数中我将不得不用“”填充“空白”空间。

我的麻烦功能有这个标题

int PutFirstAndLast(char**** matrixPointer, int *line2, int *maxCollumn2, int *lineArray)

在这个函数中,我将生成一个以半延迟方式称为“数组”的新矩阵,我将为新的“数组”分配内存,以便将文件“in.txt”中的每个单词放入其中。

int PutFirstAndLast(char**** matrixPointer, int *line2, int *maxCollumn2, int     *lineArray)
 {
FILE *inputFile;
char buffer[100], *p;
char ***array;
int i, j, collumn, maxCollumn = 0, line = -1;




inputFile = fopen("in.txt", "r");

while (fgets(buffer, 100, inputFile))
{

    line++;
    collumn = 0;


    if (line == 0)
        array = (char***)malloc(sizeof(char**));
    else
        array = (char***)realloc(array, sizeof(char**)* (line + 1) );




    p = strtok(buffer, " \n");


    while (p)
    {

             //taking each word and allocating a space for it

        if (collumn == 0)
            array[line] = (char**)malloc(sizeof(char*));
        else
            array[line] = (char**)realloc(array[line], sizeof(char*)*  (collumn + 1));


        array[line][collumn] = (char*)malloc(sizeof(char)* strlen(p) + 1);


        strcpy(array[line][collumn], p);

        collumn++;
        p = strtok(NULL, " \n");
    }


          // Here i count what is the maximum numbers of items on a line


    lineArray[line] = collumn;
    if (collumn > maxCollumn)
        maxCollumn = collumn;



}


    // Here i add "" in the "empty spaces.
for (i = 0; i < line + 1; i++)
{
    for (j = lineArray[i]; j < maxCollumn; j++)
    {
        array[i] = (char**)realloc(array[i], sizeof(char*)* maxCollumn);
        array[i][j] = (char*)malloc(sizeof(char)* 10);
        strcpy(array[i][j], "");
    }

}

fclose(inputFile);


*matrixPointer = array;
*maxCollumn2 = maxCollumn;
*line2 = line;

return 0;
 }

问题是当我来到 main 并且我这样做时

for (i = 0; i < line + 1; i++)
{
    for (j = 0; j < maxCollumn; j++)
    {
        printf("%s", matrix[i][j]);
        matrix[i][j] = (char*)realloc(matrix, sizeof(char)* 11);
    }

}

对于项目矩阵[2][0],出现“访问违规读取位置”错误。

如果我这样做了的话

for (i = 0; i < line + 1; i++)
    {
        for (j = 0; j < maxCollumn; j++)
        {
            printf("%s", matrix[i][j]);
        //  matrix[i][j] = (char*)realloc(matrix, sizeof(char)* 11);
        }

    }

没有问题,我在矩阵中的所有单词都显示在屏幕上\

我的文本模型是:

etesta este astru   
de mext pentru bun 
examen multa programare  

通过在“空”空格中添加“”,我指的是:将“”放入数组中,如下所示:

etesta   este      astru         
de       mext      pentru        bun 
examen   multa     programare    

【问题讨论】:

  • 检查 realloc 调用的第一个参数是否失败。您没有重新分配正确的指针。此外,您应该小心分配回您重新分配的同一个指针,如果reallocate 失败怎么办?然后你松开原来的指针。
  • 是的,但问题是我无法确定在这种情况下什么是适当的重新分配?我现在去检查失败。
  • 你不应该重新分配matrix[i][j]而不是matrix吗?
  • 您也根本不需要第一个 malloc。只需确保 array 在进入此之前最初为 NULL。我仍然盯着取消引用(这是很多明星,坦率地说a 3-star programmer 并不常见。
  • @JoachimPileborg “你不应该重新分配矩阵[i][j] 而不是矩阵吗?”这是正确的答案。你应该做一个。

标签: c string matrix stream dynamic-memory-allocation


【解决方案1】:

当它应该是matrix[i][j]时,你用matrix指针调用realloc函数:

matrix[i][j] = realloc(matrix[i][j], sizeof(char)* 11);

或者,如果您想保护自己免受失败:

char *temp = realloc(matrix[i][j], sizeof(char)* 11);
if (temp != NULL)
    matrix[i][j] = temp;

注意:Don't cast the return of malloc (or realloc) in C.

【讨论】:

  • @JoachimPileborg:虽然是对的,但不是按顺序推荐反对 4 星编程吗?
  • sry mate,vor voteUp 我需要 15 个代表,但我长大后会回来的!注意:我使用 realloc 是因为我的编译器是基于 C++ 的
  • 哇,你快到 10 万了!我又捐了 10 个 ;)
猜你喜欢
  • 1970-01-01
  • 2015-08-03
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多