【问题标题】:What are the difference between the following two statements? ptr = malloc (400); ptr = malloc (100 * sizeof(int))以下两种说法有什么区别? ptr = malloc (400); ptr = malloc (100 * sizeof(int))
【发布时间】:2020-09-07 21:58:24
【问题描述】:

以下两种说法有什么区别?

ptr = malloc (400);

ptr = malloc (100 * sizeof(int)) 

它是如何工作的?它们之间有什么区别吗?

ptr 'int'的类型

【问题讨论】:

  • sizeof(int) == 4 在您的平台上没有区别。始终使用ptr = malloc (100 * sizeof *ptr);,这样你就永远不会依赖类型了。
  • 另外,您应该将标签更改为动态内存分配而不是动态编程。

标签: c memory-leaks dynamic-memory-allocation


【解决方案1】:

不,不应该有。 malloc 在运行时会以 bytes 为单位分配连续的内存块,所以只要 integer 占用 4 bytes 就没有问题。

您也可以参考this,以获得更清晰的信息。

此外,由于您没有提及您正在使用的指针类型..这两种方式没有区别。假设你想要一个整数类型,那么这里是一个例子:

int *ptr;
ptr = malloc(100 * sizeof *ptr);

【讨论】:

  • 大家好,为什么是差评?解释不清楚吗?
  • 好吧,你为什么要投射结果?
  • 我想你不会写char c=(char)'a';long x=(long)5;
  • 不是我的反对票,而是:stackoverflow.com/questions/605845/…
  • 虽然malloc不管它的参数是如何计算的,都会做同样的事情,事实上这是“只要整数需要4个字节”表明400100 * size(int)是不一样的事物。它们向读者传达了不同的含义,并且当sizeof(int) 不是四个时会以不同的方式运行。这个区别很重要,应该教导学生注意它,不要把400100 * sizeof(int)认为是一样的。事实上,sizeof(int) 本身通常不是最好的选择; 100 * sizeof *ptr 通常更好。
【解决方案2】:

这取决于您的架构。在 64 位机器上,int 的大小应该是 8 字节,而在 32 位机器上应该是 4 字节。虽然这不是一个规则,但您的 64 位编译器可能会注册为 4 个字节。

因此不同的是,分配的内存可能会根据您的目标架构和编译器的决定而有所不同。

指针的大小也是如此。

【讨论】:

    【解决方案3】:

    第一种形式分配 400 个字节。

    第二种形式为 100 个int 对象分配了足够的空间。

    这些不一定相同,因为 int 的大小可以是 2、4 或更多字节宽,具体取决于平台。

    如果您需要为给定类型的N 对象留出空间,请使用以下成语:

    T *ptr = malloc( N * sizeof *ptr ); // for any object type T
    

    sizeof *ptr 等价于sizeof (T)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2021-05-18
      • 2014-08-13
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      相关资源
      最近更新 更多