我遇到了以下代码段。我有2个问题,需要一些帮助。
int *loc_buff;
loc_buff = malloc(sizeof(loc_buff[0]) * COUNT_EACH * n);
memset(loc_buff, -1, COUNT_EACH * sizeof(int) * n);
感谢。
答案 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
。