【问题标题】:Malloc, how it allocate the address? [duplicate]malloc,它如何分配地址? [复制]
【发布时间】:2017-08-16 21:18:55
【问题描述】:

我知道 malloc 分配连续的内存块并返回分配的第一个地址,我们将其保存在指针中以供使用。

我有以下问题:

我发现,如果我分配的字节数少于必要的字节数,或者尝试访问超出分配字节数的内容,程序仍然可以工作。

int *ptr;
ptr = (int*)malloc(sizeof(int) * 2);
*ptr = 1;
*(ptr + 1) = 2;
*(ptr + 2) = 3;

在我看来,*(ptr + 2) = 3; 不应该工作,但它仍然有效。我想是因为*(ptr + 1) 后面跟着*(ptr + 2) 在内存中。

我的问题是它为什么起作用,如果它像这样起作用,为什么我们不使用 malloc 只分配任何东西的第一个元素?

【问题讨论】:

  • 未定义的行为。就这样。它的工作原理,....或没有
  • 您的代码行为未定义。当您分配值时,它可能会起作用,但在您下次使用此位置时可能会损坏。您也可能只是在特定位置上写字后损坏了它
  • UB就像在小房间里拍摄。弹跳可能会杀死或伤害您,但我也不会发生任何事情
  • @chux 可能出现分段错误或其他错误。
  • @Xtx 那是关于 C 的交易,当代码违反各种规则时,语言没有指定来捕捉违规行为。代码是独立的:no training wheels.

标签: c pointers memory-management malloc


【解决方案1】:

Malloc 和 free 用作内存管理器的一部分。它们帮助您管理内存使用,因此您的程序不会意外重叠同一内存空间中的数据。您的程序通常可以随时访问整个可写内存空间(这取决于操作系统和语言)。 Malloc 和 Free 可帮助您跟踪当前正在使用的内存。当您调用 malloc 时,您正在向内存管理器请求一块空闲内存。它向您返回指向该内存块开始的指针(并且您知道它在哪里结束,因为您请求了大小),并确保在该块被释放之前,对 malloc 的其他调用不会返回相同的内存。由您来确保您的程序不会写入您分配的内存空间之外,并释放您分配的任何内存。

【讨论】:

  • 是的,在标记为C的问题中肯定有另一种语言。
猜你喜欢
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2023-03-20
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多