【问题标题】:C - computing sum and multiply it by sizeof in malloc()C - 在 malloc() 中计算总和并乘以 sizeof
【发布时间】:2017-01-27 11:48:05
【问题描述】:

我对@9​​87654322@ 中的内存分配有疑问。我有一个 int 值k。这些方式分配有什么区别

...=(int*)malloc(k*sizeof(int));

...=(int*)malloc(((2*k-1)-k+1)*sizeof(int));

知道(2*k-1)-k+1) == k

两者的结果是一样的还是第二种情况,即使((2*k-1)-k+1) == k,也能改变点什么?

【问题讨论】:

标签: c memory-management malloc sizeof dynamic-memory-allocation


【解决方案1】:

首先,please see this discussion on why not to cast the return value of malloc() and family in C.

也就是说,malloc() 接受要分配的内存字节数的参数。

引用C11,第 7.22.3.4 章,malloc() 函数

void *malloc(size_t size);

malloc 函数为大小由size [...] 指定的对象分配空间[...]

所以,只要 xy 的计算结果相同,

malloc(x * sizeof(sometype))

malloc(y * sizeof(sometype))

如果调用成功,将为您提供具有相同内存量的指针。

最后,最好不要为sizeof 运算符使用硬编码值,而是使用变量本身。使代码更健壮,比如

  int *p = NULL;
  .
  .
  .
  p = malloc (x * sizeof(*p));  // type of `p` can change, 
                                // this statement need not be changed

【讨论】:

  • 在某些情况下使用硬编码值会导致分段错误?
  • @D3m 仅当您未能检查 malloc() 是否成功时。
【解决方案2】:

虽然在数学上等同于 k,但乘积 (2*k-1)-k+1 可能会溢出,从而导致未定义的行为。 int 范围的一半与使用 k 的差异。

... = malloc(((2*k-1)-k+1)*sizeof(int))

k*sizeof(int) 产品本身会溢出,但产品是明确定义的,即使不是可取的。

溢出的可能性取决于size_tint 的范围。 size_t 通常是 int 正范围的两倍,甚至可能更多倍。很少会少。推荐:

int *p = malloc(sizeof *p * k);

注意事项:

  1. 不需要转换malloc() 的结果。
  2. 使用sizeof *p 而不是sizeof(int) 代码错误的可能性更小,更易于查看和维护。
  3. 首先使用 sizeof *p 可确保以下大部分数学运算至少使用 size_t 数学运算发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2013-02-19
    • 2014-08-13
    • 1970-01-01
    • 2015-11-22
    • 2015-01-22
    • 2017-05-13
    相关资源
    最近更新 更多