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