【问题标题】:Pointer allowing to store more than allocated size [duplicate]指针允许存储超过分配的大小[重复]
【发布时间】:2020-12-30 01:22:32
【问题描述】:

int 的大小是 4 个字节,我只分配 1 个字节。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv) {
    int *a = (int *) malloc(1);

    // But I am still able to store int.
    *a = 42;
    printf("%d\n", *a);

    // It also allowed me to store char in an int pointer.
    *a = 'H';
    printf("%c\n", *a);
}

【问题讨论】:

  • 你在问为什么未定义的行为有时会做你想要的吗?
  • @Tom Krazes 是的
  • 网站上可能有大量此问题的重复项,我不确定如何最好地解决该问题。我们应该保留一个规范的最好的吗?
  • @R..GitHubSTOPHELPINGICE:我选择了一个相当老的,相当高的投票率,它涵盖了几乎相同的情况(分配一个字节,存储更多)。似乎已经足够接近了。
  • 旁注:关于“它还允许我将 char 存储在 int 指针中”;第一,如果您在任何情况下都为其分配了足够的内存(它只会将其扩展为 int 大小),那将是合法的,但是第二,'H' 实际上是 C 中的 int(字符文字是在 C 中键入 int,是的,这很奇怪,不,在 C++ 中不一样,其中字符文字实际上是 char 类型)。

标签: c


【解决方案1】:

这个:

int* a = (int*) malloc(1);
*a = 42;

未定义的行为。它现在似乎可以工作,但以后可能不行。但在实践中,您已经破坏了堆。所有的赌注都取决于您的程序行为可能是什么 - 特别是当您添加更多代码并稍后进行更多 malloc/free 调用时。

此声明:

*a='H';

也是不安全的。相当于这样:

*a = (int)'H';

相当于这个(假设为ascii):

*a = 72;

您可能很幸运,因为 malloc 可能会在字对齐的边界上分配内存。但是不要设计你的程序来依赖它。

【讨论】:

  • s/lucky/unlucky/ 因为它隐藏了错误
猜你喜欢
  • 1970-01-01
  • 2016-03-26
  • 2014-09-02
  • 1970-01-01
  • 2017-10-01
  • 2017-10-26
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多