【问题标题】:Nicer way to create a char** buffer on the stack?在堆栈上创建 char** 缓冲区的更好方法?
【发布时间】:2012-12-25 15:40:37
【问题描述】:

我想在堆栈上创建一个 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);
}

【问题讨论】:

    标签: c memory-management stack


    【解决方案1】:

    到目前为止发布的解决方案都适用于 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 数组 — 我把它留给读者作为练习。

    【讨论】:

    • 对于不相关的、非枚举的常量不恰当地(ab)使用enum,几乎是-1……但其余的答案都很好。
    【解决方案2】:

    一个简单的char buf[4][1024]; 是否应该同样有效?

    【讨论】:

    • 对不起,我应该更清楚。我需要一个 char 指针数组,每个指针指向一个单独的缓冲区。
    • @charliehorse55 buf[0], buf[1], buf[2], buf[3] 都是 char * 类型
    • 是的,但实际上它只会连续创建一个由 4096 个字符组成的数组。当您尝试将其传递给函数时,它会衰减为 4096 个字符长的一维数组。
    • @KarthikT - 从技术上讲,它们将是 char[1024] 类型,直到您将其传递给函数(即,执行 sizeof(buf[0]) 将给您 1024,而不是 1)。
    • @detly 我的意思当然是可以将它们视为char * 需要一个,将其传递给 func 或分配给指针等。
    【解决方案3】:

    稍微好一点的版本:

    char temp0[1024], temp1[1024], temp2[1024], temp3[1024];
    char *buf[4] = {temp0, temp1, temp2, temp3};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2017-02-23
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多