【发布时间】: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