1

我正在做一项家庭作业,该作业需要创建一个动态分配的数组,该数组将使用文本文件中的字符串进行填充。然后我需要将数组打印到标准输出,随机播放数组,然后再次打印。

我当前的问题是我似乎无法在没有分段错误的情况下用任何东西填充数组。我用静态数组测试了程序,一切正常,所以我知道其他任何代码都没有问题。

这是我的程序的一部分。

void alloc2dArray(char ***source, int dim1, int dim2)
{
    int i = 0;

    source = malloc(sizeof(char *) * dim1);

    if(source == NULL) 
    { 
        printf("Memory full!");
        exit(EXIT_FAILURE);
    }
    for(i = 0; i < dim1; i++)
    {
            source[i] = malloc(sizeof(char) * (dim2 + 1));
            if(source[i] == NULL) 
        { 
            printf("Memory full!"); 
            exit(EXIT_FAILURE);
        }
    }
}

编辑:

为了避免成为三星级程序员,我将代码更改为以下代码段。幸运的是,这解决了我的问题。所以感谢 Kniggug 发布了我以前不知道的东西的链接。

char** alloc2dArray(int dim1, int dim2)
{
        int i = 0;

        char **twoDArray = malloc(sizeof(char *) * dim1);

        if(twoDArray == NULL)
        {
                printf("Memory full!");
                exit(EXIT_FAILURE);
        }
        for(i = 0; i < dim1; i++)
        {
                (twoDArray[i]) = malloc(sizeof(char) * (dim2 + 1));
                if(twoDArray[i] == NULL)
                {
                        printf("Memory full!");
                        exit(EXIT_FAILURE);
                }
        }

        return twoDArray;
}

谢谢你。

4

2 回答 2

4
Void alloc2dArray(char ***source, int dim1, int dim2)
{
    int i = 0;

    source = malloc(sizeof(char *) * dim1);

除了泄漏内存之外,上面的赋值在这个函数之外没有任何影响。你的意思是:

    *source = malloc(sizeof(char *) * dim1);

相似地:

(*source)[i] = malloc(sizeof(char) * (dim2 + 1));
于 2013-10-28T21:28:27.687 回答
1

更改source(*source)_alloc2dArray

Void alloc2dArray(char ***source, int dim1, int dim2)
{
    int i = 0;

    *source = malloc(sizeof(char *) * dim1);

    if(*source == NULL)
    {
        printf("Memory full!");
        exit(EXIT_FAILURE);
    }
    for(i = 0; i < dim1; i++)
    {
        (*source)[i] = malloc(sizeof(char) * (dim2 + 1));
        if((*source)[i] == NULL)
        {
                printf("Memory full!");
                exit(EXIT_FAILURE);
        }
    }
}
于 2013-10-28T21:29:04.210 回答