c memset函数之谜

c memset function puzzle

我想将 int* 数组设置为 null。有两种方法可以做到这一点:

1.:

int* buf[8]; memset(buf, 0, sizeof(buf));

2.:

int* buf[8]; memset(&buf, 0, sizeof(buf));

它们的结果相同,但有什么不同吗?

他们完成同样的事情。 buf 评估为指向数组第一个元素 (int*) 的指针,而 &buf 为您提供 pointer-to-array-of-8-int*s。 (类型在某种程度上有所不同。)这两个指针都可用于通过强制转换为 char* 来访问数组的字节表示形式,这就是 memset() 在概念上所做的。在内部,您实际上只是在两种情况下传递相同的地址。

作为迂腐的注释,不能保证 NULL 指针的内部表示为全零字节(尽管这在实践中极有可能)。

要直接声明pointer-to-array-of-8-int*s类型的变量,可以顺便使用如下:

int* buf[8];
int* (*bufp)[8] = &buf; /* Initialize a pointer-to-array-of-8-int* */

bufp 与指向数组第一个元素的指针的不同之处在于您可以这样做,例如sizeof *bufp 获取数组的大小。 (只有指向第一个元素的指针,编译器才能获得该信息。以上内容使其成为类型中固有的。)

如上所示,指针和数组不是一回事(它们有不同的类型,数组有专门的类型)。人们经常混淆指针和数组的原因是数组通常 评估为 指向其第一个元素的指针。 sizeof 是一种不会发生这种情况的情况。如果数组退化为具有 sizeof 的指针,那么您将获得该指针的大小而不是数组的大小,这将没有用。