更好的方式来创建堆栈上的char **缓冲区?
我想在堆栈上创建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个元素都是可以的; 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
数组 - 我将它作为读者的练习。
不应该有一个简单的char buf[4][1024];
工作一样好?
稍微好一些的版本:
char temp0[1024], temp1[1024], temp2[1024], temp3[1024];
char *buf[4] = {temp0, temp1, temp2, temp3};
链接地址: http://www.djcxy.com/p/79251.html