二进制文件中写入的字符矩阵

时间:2019-01-02 11:12:11

标签: c matrix character

我有一个文本文件,可从中读取单词。在那之后,我必须在每个单词中写一个二进制文件,并在它附近显示行和列。在_strdup(p),我的程序崩溃了。有人知道为什么吗?多谢您的协助。这是代码:

void create(const char *filename, const char ****matrix) {

    FILE *u, *f;
    u = fopen(filename, "wb");
    assert(u != NULL);
    f = fopen("in.txt", "r");
    assert(f != NULL);
    (*matrix) = (char ***)malloc(sizeof(char **) * 1);
    int i = 0;
    int j=0; char buff[1024];
    while (fgets(buff, 1024, f)!=NULL) {

        (*matrix) = realloc((*matrix), (i + 1) * sizeof(char **));
        char *p = strtok(buff, " ().,");
        (*matrix)[i] = (char **)malloc(sizeof(char *));
        while (p) {

                (*matrix)[i] = (char **)realloc((*matrix)[i], sizeof(char *)*(j + 1));
                strcpy((*matrix)[i], buff);
                (*matrix)[i][j] = _strdup(p);

                fwrite((*matrix)[i][j], sizeof(char *), 1, u);
                fwrite(&i, sizeof(int), 1, u);
                fwrite(&i, sizeof(int), 1, u);
                j++;

                (*matrix)[i][j] = NULL;

            p = strtok(NULL, " ().,");
        }
        (*matrix)[i] = NULL;
        i++;
        printf("\n");

    }
    fclose(u);
    fclose(f);
}

1 个答案:

答案 0 :(得分:0)

由于未正确分配_strdup的内存,因此对(*matrix)[i][j]的调用可能会失败。

不必使用尽可能多的指针来读取文件中的单词,但是鉴于您正在使用它们,因此需要以正确的顺序为每个指针创建内存。

>

那是

matrix = malloc(sizeof(char *));

是创建任何其他位置之前所需的第一个位置

例如,为 4维数组创建正确分配的指针集合的方法可能如下所示:

char **** Create4D(int hR, int p, int c, int r)     
{
    char ****arr;
    int    w,x,y;

    arr = calloc(hR, sizeof(char *));
    for(w=0;w<hR;w++)
    {
        arr[w] = calloc(p, sizeof(char *));
        for(x=0;x<p;x++)
        {
            arr[w][x] = calloc(c, sizeof(char *));
            for(y=0;y<c;y++)
            {                                        
                arr[w][x][y] = calloc(r, 1); 
                                      // ^ sizeof(char) == 1
            }
        }
    }
    return arr;
}

请注意,斜体是提醒您这实际上不是在创建矩阵,而只是创建一个内存地址集合,其中一些内存用于指针,另一些空间用于字符串char

调用此函数:

char ****matrix = Create4D(2, 4, 6, 8);
if(matrix)//always test for success.  If failed, matrix is set to NULL.
{ 
    //use matrix
    //With these arguments, 48 (2*4*6) pointers are created, 
    //each with space allocated to contain strings of 8 char each
    ....

还要注意,在所有这些调用中,此处不使用强制转换[m] [c] alloc的返回值 because it is not recommended in C 。另外,如果您计划创建所有这些内存,则必须为每次对free()的调用而对calloc()进行相应的调用。

在我的系统上调用上述方法产生的内存如下所示:

enter image description here