1

スタックに char** 文字配列を作成したいと考えています。現在、私はこれを使用していますが、もっと良い方法があるのだろうか:

char* buf[4];
char temp0[1024], temp1[1024], temp2[1024], temp3[1024];
buf[0] = temp0;
buf[1] = temp1;
buf[2] = temp2;
buf[3] = temp3;

編集:より明確にするために、単に使用することはできませんchar buf[4][1024]。char ポインターの配列を期待する関数は、根本的に異なるデータ型であるため、クラッシュします。これは、ヒープに配列を作成する方法です。

char** buf = malloc(sizeof(char*) * 4);
for(int i = 0; i < 4; i++)
{
    buf[i] = malloc(sizeof(char) * 1024);
}
4

3 に答える 3

2

これまでに投稿されたソリューションは、どちらも4つの要素で問題ありません。10の場合、彼らは不格好であり、100の場合、彼らは飛ぶつもりはありません。私はこれがより良くスケーリングできると思います:

enum { MAX_ROWS = 10, ROW_SIZE = 1024 };
char bigbuffer[MAX_ROWS][ROW_SIZE];
char *buf[MAX_ROWS];

for (int i = 0; i < MAX_ROWS; i++)
    buf[i] = bigbuffer[i];

...and off you go...

C99以降では、VLA(可変長配列)を使用して配列サイズをパラメーター化できます。

void buffer_creation(int rows, int cols)
{
    char bigbuffer[rows][cols];
    char *buf[rows];

    for (int i = 0; i < rows; i++)
        buf[i] = bigbuffer[i];

    ...and off you go...
}

サイズが大きくなりすぎた場合はmalloc()、もちろん代わりに使用できますが、スペースも解放する必要があります。

void buffer_creation(int rows, int cols)
{
    char *buf[rows];  // Probably won't stress the stack ever
    char *bigbuffer = malloc(rows * cols);
    if (bigbuffer != 0)
    {    
        for (int i = 0; i < rows; i++)
            buf[i] = &bigbuffer[i * cols];

        ...and off you go...
        free(bigbuffer);
    }
}

もちろん、buf本当に必要な場合は、配列を割り当てることもできます—読者のための演習として残しておきます。

于 2013-01-11T04:50:46.250 に答える
1

シンプルなchar buf[4][1024];作業も同じようにうまくいくはずではありませんか?

于 2013-01-11T04:31:22.273 に答える
0

少し良いバージョン:

char temp0[1024], temp1[1024], temp2[1024], temp3[1024];
char *buf[4] = {temp0, temp1, temp2, temp3};
于 2013-01-11T04:36:13.390 に答える