簡體   English   中英

等效表達式memset和數組

[英]equivalent expressions memset and array

#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(&na.array,0,8); memset(na.array,0,8) ;

並且它是相同na.array&na.array [0]?

它是相同的memset(&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 *的隱式轉換規則,稱為衰減 所以, na.array可以衰變char * ,這正是&na.array[0]的類型。

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

同樣的事情,你應該使用sizeof而不是硬編碼數組大小。

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

我個人更喜歡使用&來使數組的地址顯式。

當您作為參數傳遞給采用void*的函數時,您提到的三個表達式會產生相同的結果。 它之所以如此不同:

  • &na.array是數組的地址。 它匹配其初始元素的地址,但它具有不同的類型。 但是,您將它傳遞給一個取void*的函數,因此類型無關緊要。
  • na.array是陣列本身。 當傳遞給void*參數時,它“衰減”到指向數組初始元素的指針。
  • &na.array[0]是數組初始元素的地址,直接取得。 當您將其作為參數傳遞給memset時,它會轉換為void*

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM