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 回答