[英]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.