双指针上的memset操作

时间:2016-12-16 10:01:11

标签: c pointers memset pointer-to-pointer

Question是相关的。

对于以下表示,

  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执行有效操作?

2 个答案:

答案 0 :(得分:2)

在您的代码中,

 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的兼容类型。

答案 1 :(得分:1)

它在所有主要平台上都有效,除了一件事:不要将$this->load->library('calendar', $prefs); 作为要设置的值。请记住,NULL函数对内存的各个字节进行操作,您应该将所有字节设置为零(memset)。

然而,它在技术上并非严格有效。在大多数主要平台上,空指针等于零。 但是 它并非必须如此。唯一完全可移植且安全的方法是通过手动循环将每个指针明确设置为0

如果有人有兴趣知道,即使NULL定义为NULL(或0),也无关紧要。编译器会将该零值转换为空指针的特定于平台的版本,这可能不是实际的整数零。

相关问题