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
的指针,那么您将获得该指针的大小而不是数组的大小,这将没有用。
我想将 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
的指针,那么您将获得该指针的大小而不是数组的大小,这将没有用。