内存分配和重置

时间:2014-10-04 02:36:00

标签: c

我遇到了以下代码段。我有2个问题,需要一些帮助。

int *loc_buff;
loc_buff = malloc(sizeof(loc_buff[0]) * COUNT_EACH * n);
memset(loc_buff, -1, COUNT_EACH * sizeof(int) * n);
  1. 使用sizeof(loc_buf [0])而不是sizeof(int)是否正确?
  2. 此memset会将所有loc_buf重置为-1吗?
  3. 感谢。

2 个答案:

答案 0 :(得分:4)

  

使用sizeof(loc_buf[0])代替sizeof(int)是否正确?

从技术上讲,这是正确的,因为它是相同的:sizeof(loc_buf[0])sizeof(*loc_buf)sizeof(int)都是一样的。但是,由于在这两种情况下都采用了大小来处理相同的动态分配缓冲区,因此这是不一致的。一个人应该以你选择的相同方式重写两个sizeof;你喜欢哪一个并不重要。

  

memset会将所有loc_buf重置为-1吗?

是的,它会的。但是,情况并非完全简单:在设置为内存块的元素之前,您提供的值将转换为unsigned char。在两个补码表示中-1由设置为1的所有位组成。这将被转换为带有所有1的unsigned char,它将在块中的所有字节中设置。现在整个块由字节组成,其所有位都设置为1。当这些字节被重新解释为int时,它们再次成为-1

答案 1 :(得分:3)

运营商sizeof有两种形式:sizeof(type)sizeof expression。在您的情况下,您可以使用sizeof(int)sizeof loc_buff[0]sizeof *loc_buff来获得相同的结果。请注意,当()的参数是表达式(不是类型)时,sizeof是完全可选的。 sizeof运算符具有高优先级,这使得()在大多数情况下都是多余的(包括您的示例)。

至于memset ...正式情况下,不保证在一般情况下将loc_buff元素设置为-1。这个memset保证以0xFF...F位模式填充内存,但当解释为int对象时,该位模式的含义取决于实现。在二进制补码机器上,这确实是-1,但在非二进制机器上它是完全不同的。

从非常迂腐的角度来看,唯一可移植的memset使用非char整数数组将所有内容设置为0