【问题标题】:Xcode: malloc size doesn't seem to matter [duplicate]Xcode:malloc大小似乎无关紧要[重复]
【发布时间】:2014-03-23 07:32:09
【问题描述】:

在下面的代码中,我可以将 malloc 的参数更改为任何值(至少是我尝试过的值),一切看起来都很好。

例如,我可以将“3 * sizeof(float)”更改为“3 * sizeof(char)”,甚至为零。而且我仍然可以获得“正确”的结果。堆大小似乎根本不重要。

这真的让我很困惑。怎么会这样?

代码在 Xcode 5 中编写和运行。

float *favorites = malloc(3 * sizeof(float));

favorites[0] = 3.14158;
favorites[1] = 2.71828;
favorites[2] = 1.41421;

for (int i = 0; i < 3; i++) {
    printf("%.4f is favorite %d\n", favorites[i], i);
}

free(favorites);
favorites = NULL;

【问题讨论】:

  • 内存通常以 16 字节的倍数的块形式分配。由于您的数组仅占用 12 个字节,因此您请求的内存量并不重要。如果您希望程序崩溃,请尝试用更多的条目填充您的数组。
  • 谢谢@JensGustedt,我确实尝试过先搜索类似的问题,但在您的评论中没有找到。
  • 对我来说,该问题的参考在您问题的右栏中给出。这强烈表明网站应该在输入您的问题文本时提出建议。
  • 谢谢@JensGustedt,你是对的。以后我会更加关注那个部分。不过我不想删除我的问题,所以我将其标记为重复。
  • 你也可以写:favorites[3]=3.333;favorites[4]=4.4444;favorites[5]=5.65555;...等等等等。谁在乎应用程序是否意外崩溃。

标签: c++ objective-c c xcode malloc


【解决方案1】:

这是因为这样做你的程序会调用undefined behavior。一旦 UB 被调用,所有的赌注都会被取消。您可能会得到预期或意外的结果。

现在尝试不分配内存给favoritee

float *favorites ;
...

看看会发生什么?

【讨论】:

  • 非常感谢您的回答。实际上我以前没有听说过未定义的行为。感谢您帮助我在这里学到新东西。
【解决方案2】:

您的程序只是看起来有效。实际上 malloc 在内部分配了一大块内存(至少一个内存页)并返回该内存区域内的指针。

因此,您的指针指向某个内存页的开头,如果您稍微越界,则不会发生任何事情。如果您通过边界过多(超过 4KB 或 4MB),您将收到错误消息。

另外,如果你调用两个malloc,然后传递第一个分配空间的范围,你会遇到问题,因为malloc在返回指针之前存储了它的一些内部数据。

无论如何,从语言的角度来看,您已经调用了“未定义的行为”,这意味着没有人关心如果您这样做会发生什么。您的程序的行为可能会从一个编译器版本更改为另一个,从一个系统更改为另一个...

【讨论】:

    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2020-04-04
    • 2019-09-05
    • 1970-01-01
    • 2020-01-20
    相关资源
    最近更新 更多