alloca()在堆栈上而不是在堆上分配内存,如同的情况一样malloc().所以,当我从例程返回时,内存被释放.所以,实际上这解决了我释放动态分配内存的问题.释放分配的内存malloc()是一个令人头痛的问题,如果不知何故错过会导致各种内存问题.
alloca()尽管有上述特征,为什么不鼓励使用?
如何在D,C和C++等语言中使用内联x86汇编程序实现alloca()?我想创建一个稍微修改过的版本,但首先我需要知道标准版本是如何实现的.从编译器中读取反汇编并没有帮助,因为它们执行了很多优化,我只想要规范形式.
编辑:我想困难的部分是我希望它具有正常的函数调用语法,即使用裸函数或其他东西,使它看起来像普通的alloca().
编辑#2:啊,到底是什么,你可以假设我们没有省略帧指针.
我一直想知道如何逃脱这个:
int main(int argc, char **argv) {
printf("%p %s %d\n", &argv[1], argv[1], strlen(argv[1]));
char copy[strlen(argv[1]) + 1];
strcpy(copy, argv[1]);
printf("%p %s %d\n", ©, copy, strlen(copy));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
copy无论如何,char数组都被分配,程序运行正常,打印出原始数据和副本.而Valgrind并没有抱怨什么.
我认为没有malloc的C语言中不可能使用动态数组.我错了吗?
有什么区别
void *bytes = alloca(size);
Run Code Online (Sandbox Code Playgroud)
和
char bytes[size]; //Or to be more precise, char x[size]; void *bytes = x;
Run Code Online (Sandbox Code Playgroud)
...其中size是一个在编译时值未知的变量.
当我运行以下代码时,它适用于C:
#include<stdio.h>
int main(void)
{
const int x=5;
char arr[x];
printf("%d",sizeof(arr));
}
Run Code Online (Sandbox Code Playgroud)
但是,不仅我之前读过const合格的变量不是real常量(这就是为什么它们不能在case条件下使用switch-case),但IBM的以下链接证实了(IBMLINK)并说:
const int k = 10;
int ary[k]; /* allowed in C++, not legal in C */
Run Code Online (Sandbox Code Playgroud)
为什么我允许const在C中使用合格变量作为数组大小而没有任何错误?