繁体   English   中英

堆栈上的动态内存分配

[英]Dynamic memory allocation on stack

我最近尝试过这个实验,其中我没有为未知大小的内存需求进行动态内存分配,而是进行了静态分配。 a[i]声明一个数组a[i]时,我保持i (数组的大小)变量并且依赖于用户给出的输入。

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <conio.h>
 void function(int );
 int main(void)
 {
     int i;
     printf("Enter:");
     scanf("%d",&i);
     function(i);
     printf("i = %d\n",i);
     getch();
     return 0;
 }
 void function(int i)
 {
      char a[i];
      char b[4];
      strncpy(a,"hello",i);
      strcpy(b,"world");
      int j = 0;
      char *c = a;
      for( j = 0; j< 20; j++ )
           printf("%c",*c++);
 }

我的问题是:

  • 这样的手术合法吗?
  • 如果不是,为什么编译器不发出任何警告或错误?
  • 这个内存将在哪里分配:堆栈还是堆?
  • 为什么ANSI C / GCC允许这样做?

这样的手术合法吗?

它被称为可变长度数组。

VLA在ANSI C99中是合法的,并且是一些C99前编译器的扩展。 GCC支持严格的C99和非C99代码的扩展。 它在C ++ 0x中也是合法的。

如果不是,为什么编译器不发出任何警告或错误?

用gcc:

$ gcc -std=c89 src/vla.c  -Wall -ansi -pedantic
src/vla.c: In function ‘function’:, not dynamic array.
src/vla.c:17: warning: ISO C90 forbids variable length array ‘a’
src/vla.c:21: warning: ISO C90 forbids mixed declarations and code

MSDOS中存在'conio.h'表示您可能正在使用Microsoft Visual C ++编译器,因此不必担心。 MS一直致力于使他们的编译器更符合C ++ 0x标准,但没有声明它的C编译器模式是如何标准的。 你问为什么西班牙方言词不在法语词典中。

这个内存将在哪里分配:堆栈还是堆?

它是一个自动对象,因此出于效率原因,大多数C实现都会放入堆栈中。

为什么ANSI C / GCC允许这样做

它对于在运行时创建可变大小的临时数组很有用,它的生命周期不会延伸到函数调用之外。

这是有效的C99

在此处查看另一个StackOverflow问题中的更详细说明。

这是合法的,但并非所有编译器都支持它。 至少Visual Studio <= 2003 afaik不支持它。

我认为它不是Ansi C ++,试试gcc -ansi -pedantic。

可变长度数组在ANSI C(C89)中是非法的。 尝试提高编译器的警告级别,我相信你会收到警告/错误。

代码有效,但在使用可变长度数组时要记住一件事。

void function(int i)
{
     int a[i];
     .
     .
}

这里没有错误检查。 如果i太大,这段代码可能会失败。

堆栈上的动态内存分配:

有一个库调用_malloca,它在程序堆栈上动态分配内存(非常类似于在堆上的malloc)

参考: _malloca

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM