【问题标题】:whats the difference between dynamic memory allocation and normal memory allocation?动态内存分配和正常内存分配有什么区别?
【发布时间】:2018-01-26 14:33:48
【问题描述】:

谁能告诉我我在这里使用的两种给定方法中的内存类型之间的区别 因为一开始我是这样说的:

5-->1893664096-->32766-->-1358605976-->2-->1893664096

在第二种方法中,我得到了这个:-

5-->0-->0-->0-->2-->0

下面是代码:-

方法一:

#include<stdio.h>
#include <stdlib.h>
int main()
{
  int n;
  scanf("%d",&n);
  int arr[n];
  arr[3]=2;
  for(int i=0;i<n;i++)
    printf("-->%d",arr[i]);
  return 0;
}

方法二:

int main()
{
  int *a;
  int n;
  scanf("%d",&n);
  a=(int*) malloc(sizeof(int)*n);
  a[3]=2;
  for(int i=0;i<n;i++)
    printf("-->%d",a[i]);
  return 0;
}

【问题讨论】:

  • 在这两种情况下,您只初始化了 一个 数组元素(假设 n 至少为 4),其余的都没有,因此行为未定义。
  • 使用malloc后必须手动释放内存。为此,您需要使用 free(a);如果你不这样做,那里的垃圾将从你的程序中保留下来,直到你重新启动计算机,你将无法使用它。如果需要,您还可以重新分配大小。
  • @dbl 分配的内存通常会在程序退出时交还给系统。
  • 导致奇怪输出的不是两个程序之间的差异,而是它们的共同点:数组未初始化。在一种情况下,它们碰巧0,而在另一种情况下却不是——内存分配在用户空间的不同部分。
  • ... 并且在 C 语言级别没有为什么,因为您的两个程序都表现出 未定义的行为就C语言而言。

标签: c arrays pointers dynamic-memory-allocation


【解决方案1】:

malloc() 不应该将它返回的内存归零。似乎在您的情况下,它恰好是从系统中检索以前未使用过且仍然为零的内存。你当然不能指望这一点。另一方面,calloc() 会在返回之前为您清零内存。

【讨论】:

    【解决方案2】:

    你所看到的是undefined behavior的体现。

    在第一种情况下,您在函数内部定义一个数组,而在第二种情况下,您通过调用malloc 分配一个数组。在这两种情况下,该内存未初始化,这意味着您无法预测这些值将是什么。

    【讨论】:

      【解决方案3】:

      正如您所问的关于动态和静态之间区别的问题,动态内存位置是在运行时分配的内存位置,而正常情况下是我们之前初始化内存的位置。喜欢 ar[3]

      【讨论】:

      • 1) 他说的是“正常”,而不是静态的。据我所知,“正常”毫无意义,但如果你回答的是你认为他想问的问题,那么明确这一点很重要。 2) arr 和 a both 在运行时分配。一个分配在堆栈上,另一个分配在堆上。
      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多