【发布时间】:2014-09-07 02:27:21
【问题描述】:
我有以下代码:
void function(char *str)
{
int i;
char buffer[strlen(str) + 1];
strcpy(buffer, str);
buffer[strlen(str)] = '\0';
printf("Buffer: %s\n", buffer);
}
我希望这段代码会引发编译时错误,因为在堆栈上分配的“缓冲区”具有运行时相关长度(基于 strlen())。但是在 GCC 中编译通过了。这是如何运作的?缓冲区是动态分配的,或者如果它仍然是堆栈本地的,那么分配的大小是多少?
【问题讨论】:
-
这是有效的 C99,是的,它是根据计算的大小在堆栈上分配的。
-
@mafso 为什么说它会导致未定义的行为?
-
您标记了两种不同的语言。这在(现代)C 中有效,但在(标准)C++ 中无效。你用的是哪个?
-
@DrewMcGowen 对不起,我有点慢。所以我的理解是,这在非 C99 中是完全有效的,并且在每次调用 function() 时,缓冲区都会在堆栈上分配;并且大小将等于 strlen() 的计算结果?