簡體   English   中英

雙指針上的memset操作

[英]memset operation on double pointer

問題是相關的。

對於以下表示,

  typedef struct List{

    void **array; // array of void*
    int lastItemPosition;
    int size;
  }List;

  #define INITIAL_LIST_SIZE 50

createList執行如下所示,

List *createList(List *list, Op opType){

  List *lptr = (List *)malloc(sizeof(List));

  if(opType == CREATE_NEW_LIST){

    lptr->array = malloc(INITIAL_LIST_SIZE*sizeof(void*));
    lptr->array = memset(lptr->array, NULL, INITIAL_LIST_SIZE*sizeof(void *));
    lptr->lastItemPosition = -1;
    lptr->size = INITIAL_LIST_SIZE;
}

memset是否在lptr->array上執行有效操作?

在您的代碼中

 memset(lptr->array, NULL, INITIAL_LIST_SIZE*sizeof(void *));

是錯誤的,因為第二個參數應該是int ,所以您傳遞了一個指針。 轉換是高度實現定義的行為,在大多數情況下,它將調用UB。

相關內容,引用C11 ,第§7.19章

NULL
擴展為實現定義的空指針常量; [...]

以及第6.3.2.3節

值為0的整數常量表達式,或強制類型為void *的表達式,稱為null pointer constant

因此, NULL是指針類型,無論如何都不是與int兼容的類型。

它在所有主要平台上均有效,除了以下幾點:不傳遞NULL作為要設置的值。 請記住, memset函數對內存的各個字節進行操作,並且應將所有字節設置為零( 0 )。

但是,從技術上講,它不是嚴格有效的。 在大多數主要平台上,空指針等於零。 但這不是必須的。 唯一完全可移植且安全的方法是通過手動循環將每個指針顯式設置為NULL


而且,如果有人有興趣知道,即使將NULL定義為0 (或((void *) 0) )也沒關系。 編譯器會將那個零轉換為空指針的特定於平台的版本,這可能不是實際的整數零。

暫無
暫無

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

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