4

所以我正在研究内存分配,它说你只能使用 malloc() 动态分配内存;但这不是动态内存分配吗?顺便说一句。所以我有点困惑。

#include<stdio.h>
#include<conio.h>
int main()
{
    int integer,cntr;
    scanf("%d",&integer);
    char words[integer];
    for(cntr = 0;cntr < integer - 1;cntr++)
        words[cntr] = 'k';
    words[cntr] = '\0';
    printf("%s",words);
    getch();
    return(0);
}
4

3 回答 3

4

那是一个变长数组。大小确实是动态的,但实际上它通常会分配在堆栈而不是堆上(所以不要将它用于太大的东西)。

根据您的编译器等,这可能最终会比分配堆内存快得多,只不过是堆栈指针的调整。

可变长度数组是在 C99 标准中引入的,因此请记住,您将无法在非常旧的 C 编译器(例如 MSVC)中使用它们。

于 2012-09-06T15:59:10.920 回答
1

该数组是一个本地数组,一旦定义它的作用域( , ) 结束,它将自动释放。 从技术上讲,该标准没有定义它应该分配到哪里,而只定义了这样一个数组必须提供的特性。该标准甚至没有提到堆栈或堆。: {}

于 2012-09-06T15:59:03.570 回答
0

这是静态的,因为数组是在堆栈上分配的,而不是在堆上

它不是由内存管理器分配的,它只是保留在堆栈上,仅此而已。一旦超出范围,它就会不复存在(从某种意义上说,使用它会提供垃圾)。

请注意,由于堆栈是有限的,您将无法以这种方式分配这么大的数组。

于 2012-09-06T15:58:48.343 回答