[2D数组中的列要比预期的多

问题描述 投票:0回答:1

我想将填充了从0到14的数字的2D数组(3x5)复制到1D数组中。当我创建静态数组时,它起作用了。我想对一些动态分配的数组做同样的事情,遇到一个问题。而不是3行5列,该数组似乎有8列,并为我提供了一些随机值的输出。

[如果有人可以帮助我,我会很高兴。我尝试修复了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);
}

我希望输出看起来像这样:

enter image description here

这是它的外观:

enter image description here

c arrays multidimensional-array
1个回答
0
投票
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];
}

这意味着您将2D数组的值复制到1D数组。

然后在主要功能中:

array_copy (Array_basis, Array_result, M, N);
© www.soinside.com 2019 - 2024. All rights reserved.