2

私は多次元arr [3] [4]を持っています。

次に、newArr[4][3] にメモリを割り当て、arr の行を列に、列を行に変更して newArr に保存します。

arr を newArr に動的に置き換えることは可能ですか? 状況を明確にするための小さな例:

#include <stdio.h>

void change(int[][4], int, int);

int main()
{
    int arr[][4] = {
        {1, 3, 2, 4},
        {3, 2, 4, 5},
        {9, 3, 2, 1},
    };
    change(arr, 4, 3);
    // now, there should be arr[4][3] = newArr

    getchar();
}

void change(int arr[][4], int cols, int rows)
{
    // create newArr array.
}
4

2 に答える 2

2

いいえ。真の配列のサイズを変更することはできません。

これを機能させるには、全体で動的割り当てを使用する必要があります。多次元配列を動的に割り当てる方法が不明な場合は、たとえばhttp://c-faq.com/aryptr/dynmuldimary.htmlを参照してください。

于 2013-01-19T13:29:27.677 に答える
0

確かにそれはできますが、少し異なる方法で行うことができます。固定サイズの配列では、それを行うことはできません。動的メモリ割り当てを行う必要があり、その後、必要に応じて添え字を使用できます。エラーを回避するために、現在使用している添え字を追跡する必要があります。

#include <stdio.h>
#include<string.h>

void change(int **, int, int);

int main()
{
    int **arr = (int **)malloc(sizeof(int)*3*4);

    // Fill this memory in whatever way you like. I'm using your previous array
    // to fill arr.
    // Note that initial_arr is not your working arr. Its just for initialization
    int initial_arr[][4] = {
        {1, 3, 2, 4},
        {3, 2, 4, 5},
        {9, 3, 2, 1},
    };

    memcpy(arr, initial_arr, sizeof(int)*3*4);

    // You can access arr in the same way as you do previously. for example 
    // to print arr[1][2] you can write
    // printf("%d", arr[1][2]);


    change(arr, 4, 3);

    // now, simply copy newArr in arr. and you can subscript arr as arr[4][3]
    memcpy(arr, newArr, sizeof(int)*3*4);

    getchar();
}

void change(int **arr, int cols, int rows)
{
    // create newArr array.
}
于 2013-01-20T03:02:47.943 に答える