我想将填充了从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);
}
我希望输出看起来像这样:
这是它的外观:
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);