【问题标题】:Segmentation Fault when filling a dynamical 2D array in C在 C 中填充动态二维数组时出现分段错误
【发布时间】:2018-06-16 06:26:42
【问题描述】:

我尝试创建一个二维数组并尝试用文件中的整数填充它。 但是当我运行我的程序时,根据 Valgrind,我在这一行得到了一个分段错误:

*(array_valid_char++) = read_char;

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int* f(char* name_file_in, int key_length)
{
    FILE *file_in;
    int* array_valid_char = malloc(95 * sizeof(int));//array of validated characters
    int count_char = 0;//count number of characters in file_in
    int read_char;//character being read

    file_in = fopen(name_file_in,"rb");

    if(file_in)
    {
        while ((read_char = fgetc(file_in)) != EOF)//browse the entire file
        {
            if ((count_char % key_length) == 0)//test if character's position in file belongs to the modulo of the key
            {
                for (int i = 0; i < 95; i++)//browse the entire array tabLatin
                {
                    *(array_valid_char++) = read_char;//read character put into array of validated characters
                }
            }
            count_char++;
        }
    }

    if(file_in){fclose(file_in);}

    return array_valid_char;
}

int** C1(char* name_file_in, int key_length)
{
    int **array_valid_keys = malloc(key_length * sizeof(int*));//array of array filled with all valid characters for a character of the key
    for (int i = 0; i < key_length; i++)
    {
        array_valid_keys[i] = malloc(95 * sizeof(int));
    }
    for (int i = 0; i < key_length; i++)
    {
        array_valid_keys[i] = f(name_file_in,i + 1);//for each character'position of the key is assigned an array given by f
    }
    return array_valid_keys;
}


int main(int argc,char* argv[])
{
    int key_length = atoi(argv[2]);
    int** array_valid_key = C1(argv[1], key_length);
    for(int i = 0; i < key_length; i++)
    {
        for(int j = 0; j < 95; j++)
        {
            printf("[%d] ",array_valid_key[i][j]); //printing all valid characters for each character of the key
        }
        printf("\n");
    }
    return(0);
}

这段代码有什么问题?

如果我理解正确,分段错误是一个超出 程序分配的内存。所以我的问题应该是尺寸 我的 2D-Array 或我尝试填充它的方式。

但是,我已经分配了许多这样的 key_length 列:

int **array_valid_keys = malloc(key_length * sizeof(int*));

而且,我已将每一列分配为包含 95 个案例的数组:

for (int i = 0; i < key_length; i++)
{
    array_valid_keys[i] = malloc(95 * sizeof(int));
}

当我用

填充这个二维数组时
for (int i = 0; i < 95; i++)//browse the entire array tabLatin
{
    *(array_valid_char++) = read_char;
}

它不应该出错,因为我的循环在 [1, 95] 区间内 (这是我的二维数组每列的大小)。

另一种解释是我的一个指针根据这个question 悬空,但是如何?

【问题讨论】:

    标签: c multidimensional-array segmentation-fault malloc


    【解决方案1】:

    看看你的sn-p代码如下:

    while ((read_char = fgetc(file_in)) != EOF)//browse the entire file
    {
        if ((count_char % key_length) == 0)//test if character's position in file belongs to the modulo of the key
        {
            for (int i = 0; i < 95; i++)//browse the entire array tabLatin
            {
                *(array_valid_char++) = read_char;//read character put into array of validated characters
            }
        }
        count_char++;
    }
    

    外部循环(while 循环)用于读取单个字符,直到到达末尾。现在在内部循环(for 循环)中,您从 0 数到 94(如果i 达到 95,则循环结束)。在该循环中,您将递增 array_valid_char 的指针。

    如果测试条件 (((count_char % key_length) == 0)) 首次有效,您将使用 read_char 的值填充 array_valid_char 的所有 95 个元素。

    但是,如果测试条件第二次有效,那么您正在做同样的事情。但是现在array_valid_char 超出了它的范围。因为它指向数组的第 96 个元素(不存在)。

    【讨论】:

    • 如果我错了,请纠正我:第一次使用 *(array_valid_char++) = read_char;它会影响 array_valid_char[0] 处的 read_char 吗?
    • 是的,你是对的。第一次执行*(array_valid_char++) = read_char; 行时read_char 被写入array_valid_char[0]
    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 2010-12-27
    • 1970-01-01
    • 2021-03-25
    • 2021-08-04
    • 2017-08-12
    • 2013-11-26
    • 1970-01-01
    相关资源
    最近更新 更多