2

我主要是一名 Java 人员,最近从事一些涉及 C 的项目,所以如果这是一个基本的 C 问题,请多多包涵。

所以在我的 main 里面我有一个 while 循环,我每次迭代都声明一个变量。

int main()
{
  int done = 0;
  while(!done)
  {
    char input[1024];
    scanf("%s", input);
    //parse the input string
    ...
  }
} 

现在,由于输入变量每次都会根据用户想要的内容而改变,因此我每次都必须使用“新”变量。但是,我认为上述声明最终会导致内存泄漏(或者会吗?)。我想知道 gcc 是否负责垃圾收集。

有没有更好的方法而不在每次迭代后分配和释放?

4

3 回答 3

6

我认为上述声明最终会导致内存泄漏(或者会吗?)。

不,它不会:input是一个自动(又名“堆栈”)变量,一旦超出范围(即在右括号之后),它将被“释放”。

有没有更好的方法而不在每次迭代后分配和释放?

没有实际的分配或释放:自动内存中的空间(也称为“堆栈上”)是由堆栈指针周围的一些编译时簿记分配的。自动变量的访问是一个非常快速的操作,在硬件的大力协助下,因此没有效率损失。

动态内存分配(Java 风格)是在 C 中使用malloc//完成的callocrealloc这些不是垃圾收集 - 您需要显式free分配您分配的每个指针。

于 2013-01-14T22:31:33.357 回答
1

但是,我认为上述声明最终会导致内存泄漏(或者会吗?)

它不会。input每次}遇到循环的尾随时都会丢弃该对象。

于 2013-01-14T22:31:43.643 回答
0

正如其他人已经说过的那样,堆栈变量在超出范围时会自动释放,并且通常很快就会被覆盖。

话虽这么说,我写这个答案的原因是强调这一点:C 中没有垃圾收集器,至少默认情况下没有。这意味着您必须手动释放分配的内存(通常使用 和其他初始化malloc) (使用)。callocfree

于 2013-01-14T22:38:21.647 回答