【问题标题】:2D array has more columns then expected二维数组的列比预期的多
【发布时间】:2020-05-12 18:56:44
【问题描述】:

我想将一个填充了 0 到 14 数字的二维数组 (3x5) 复制到一个一维数组中。当我创建静态数组时它已经工作了。 我想对一些动态分配的数组做同样的事情,但遇到了问题。数组似乎有 8 列,而不是 3 行和 5 列,并给我一个带有一些随机值的输出。

如果有人可以帮助我,我会很高兴。我尝试修复了 2 个小时,但我无法弄清楚问题出在哪里。

代码:

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

#define M 3
#define N 5

void output(int* Array, int m, int n)
{
        for( int i=0 ; i<m ; i++)
        {
            for( int j=0 ; j<n ; j++)
                printf("\t%d", Array[i*n + j]);

            printf("\n");
        }
        printf("\n");
}

void array_copy(int* Array_2d, int* Array_1d, int m, int n)
{
    for( int i=0; i<m; i++)
        for( int j=0; j<n; j++)
            Array_1d[i*n + j] = Array_2d[i*n + j];
}

int main(int argc, char **argv)
{
    //int Array_basis [M][N] = { { 0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}, {10, 11, 12, 13, 14} };

    //int Array_result [M*N];

    int** Array_basis;                              // Create 2D Array
    Array_basis = malloc(M*sizeof(int*));
    for(int i=0; i<M; i++)
        Array_basis[i] = malloc(N*sizeof(int));

    for(int i=0; i<M; i++)                          // This part should fill the array with numbers from 0 to 14, but e.g. Array_basis [0][7] = 0; is also working, so that some values from [M][5] to [M]{7] are random
        for(int j=0; j<N; j++)
            Array_basis[i][j] = i*N + j; 

    int* Array_result = malloc((M*N*sizeof(int)));  //  Create 1D Array

    output(*Array_basis, M, N);

    array_copy (*Array_basis, Array_result, M, N);

    output(Array_result, M, N);
}

我希望输出如下所示:

这就是它的样子:

【问题讨论】:

    标签: c arrays multidimensional-array


    【解决方案1】:
    output(*Array_basis, M, N);
    

    使用N * sizeof int 分配(在您的代码Array_basis[i] = malloc(N*sizeof(int)); 中)。因此,当您在 output 函数中使用它时,您会用完之前为它分配的内存(因为 int** Array_basis 的内存不会像您问题中的注释那样连续)。

    您应该将output 函数更改为;

    void output(int *array, int n) {
        for(int i = 0; i < n; i++) {
            printf("%d ", array[i]);
        }
    }
    

    然后,在主函数中,当你调用这个函数时:

    for (int i = 0; i < M; i++) {
        output(Array_basis[i], N); // print each row here
        printf("\n");
    }
    // for Array_result
    output(Array_result, M*N);
    

    复制功能应改为:

    void array_copy(int** Array_2d, int* Array_1d, int m, int n)
    {
        for( int i=0; i<m; i++)
            for( int j=0; j<n; j++)
                Array_1d[i*n + j] = Array_2d[i][j];
    }
    

    这意味着您将二维数组的值复制到一维数组。

    然后在主函数中:

    array_copy (Array_basis, Array_result, M, N);
    

    【讨论】:

    • 我明白了。非常感谢您抽出宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2019-10-07
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多