In GNU C, you can replace most uses of alloca with an array of variable size. Here is how open2 would look then:
int open2 (char *str1, char *str2, int flags, int mode)
{
char name[strlen (str1) + strlen (str2) + 1];
strcpy (name, str1);
strcat (name, str2);
return open (name, flags, mode);
}
But alloca is not always equivalent to a variable-sized array, for several reasons:
A variable size array's space is freed at the end of the scope of the name of the array. The space allocated with alloca remains until the end of the function.
It is possible to use alloca within a loop, allocating an additional block on each iteration. This is impossible with variable-sized arrays.
Note: If you mix use of alloca and variable-sized arrays within one function, exiting a scope in which a variable-sized array was declared frees all blocks allocated with alloca during the execution of that scope.