2012-04-23 51 views
1

考虑以下代码的可变长度阵列(误差为简洁检查删除):ALLOCA超过用于字符缓冲器

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

你一般都想像上面那样使用VLA,因为它干净而标准,而alloca很丑并且不在标准中(好吧,不是在C标准中,无论如何 - 它可能在POSIX中)。

0

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

  1. esp被移动一个适当的值。
  2. 采取的堆栈内存为probe'd。
  3. 该函数将必须有一个适当的堆栈框架(即它应该使用ebp来访问其他当地人)。

这两种方法都是这样做的。两者都没有“常规”错误处理(在Windows和Linux上引发SEH异常)。

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

P.S.考虑使用malloca

+0

我不知道malloca,但我想这是Windows的东西吧?我的图书馆似乎没有找到malloca。 – yasar 2012-04-23 17:21:43