等效表达式memset和数组

时间:2018-05-27 01:28:47

标签: c

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){

    struct name{

         char array[8];

    };

    struct name na;
    memset(&na.array,0,8); 


 }

memset(&amp; na.array,0,8); memset(na.array,0,8); ?

&amp; na.array [0] na.array 是一样的吗?

3 个答案:

答案 0 :(得分:1)

  

它是相同的memset(&amp; na.array,0,8); memset(na.array,0,8); ?

但是,这仅表示两种变体的行为相同。 &na.arrayna.array的类型非常不同。

na.array的类型为char[8],是一个包含八个char的数组。 &na.array类型为char(*)[8]指针为八个char的数组。

  

与na.array [0]相同的na.array?

严格来说,没有。 na.array实际上是char[8]类型,而&na.array[0]类型为char *。但是,存在从char[8]char *的隐式转换规则,称为 decay 。因此,na.array可以衰减char *,这正是&na.array[0]的类型。

答案 1 :(得分:1)

  

它是相同的memset(&amp; na.array,0,8); memset(na.array,0,8); ?

同样的事情,您应该使用sizeof而不是硬编码数组大小。

memset(&na.array,0,sizeof(na.array));

就个人而言,我更希望使用&使数组的地址显式化。

答案 2 :(得分:1)

当您作为参数传递给采用void*的函数时,您提到的三个表达式会产生相同的结果。它之所以如此是不同的:

  • &na.array是数组的地址。它匹配其初始元素的地址,但它具有不同的类型。但是,您将其传递给函数void*,因此类型无关紧要。
  • na.array是数组本身。它&#34;衰变&#34;传递给void*参数时指向数组的初始元素。
  • &na.array[0]是数组初始元素的地址,直接采用。当您将其作为参数传递给void*时,它会转换为memset