用于字符缓冲区的可变长度数组的alloca

时间:2012-04-23 16:55:12

标签: c arrays memory-management stack

考虑这段代码(为简洁起见,删除了错误检查):

int main()
{
        int fd, nread;
        struct stat st_buff;

        /* Get information about the file */
        stat("data",&st_buff);
        /* Open file data for reading */
        char strbuff[st_buff.st_blksize];
        fd = open("data",O_RDONLY);

        /* read and write data */
        do {
                nread = read(fd,strbuff,st_buff.st_blksize);
                if (!nread)
                        break;
                write(STDOUT_FILENO, strbuff, nread);
        } while (nread == st_buff.st_blksize);

        /* close the file */
        close(fd);

        return 0;
}

这段代码在堆栈上为缓冲区分配内存(如果我没有误解的话。)还有alloca()函数我可以用于同样的目的(我猜)。我想知道为什么我要选择一个而不是其他的?

2 个答案:

答案 0 :(得分:2)

你通常想要使用上面的VLA,因为它是干净和标准的,而alloca是丑陋的而不是标准(好吧,不是在C标准中,无论如何 - 它可能在POSIX)。

答案 1 :(得分:0)

我很确定两者在机器代码级别都是一样的。两者都从堆栈中获取内存。这具有以下含义:

  1. esp移动了适当的值。
  2. 所采用的堆栈内存为probe'd。
  3. 该函数必须有一个合适的堆栈帧(即它应该使用ebp来访问其他本地人)。
  4. 两种方法都这样做。两者都没有“常规”错误处理(在Windows中引发SEH异常,在Linux上引发任何异常)。

    如果你考虑可移植性,有理由选择一个而不是另一个。 VLA不是标准的恕我直言。 alloca似乎更标准。

    P.S。考虑使用malloca