memset初始化指针指向

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了memset初始化指针指向相关的知识,希望对你有一定的参考价值。

char *send;
使用malloc为send分配空间后用:
memset(send, 0, sizeof(send));
然后用:
if (NULL == send)
printf("null\n");

为啥这里不会打印null呢?用memset()会让send指向ascii的0,即NUL?谢谢!
ascii的0是空字符,不是NULL空地址

if (NULL == send)
printf("null\n");

这句话是判断send是否“指向空”(例如malloc时候错误等等)而不是其指向的内容
memset(send, 0, sizeof(send));只是将其指向的内容的一片连续区域的内存设为0
两者不是一回事
参考技术A 两个问题:
一、char *send;
使用malloc为send分配空间后用:
memset(send, 0, sizeof(send)); //这句应用不合适,不能完全初始化send所指向的地址空间
****************************************sizeof(send)==4(32位机上,所有指针的长度都是四个字节)
应当这样应用
send=malloc( Length ); //Length为要申请的空间大小(字节数)
if ( send == NULL ) //malloc出错会返回NULL给send

printf("malloc error!" );
exit(-1);

memset( send , 0 , Length ); //注意这里的长度为Length,即申请多少空间就初始化多大内存

二、if (NULL == send) //malloc成功后,send就指向了新分配的址,当然不是NULL
printf("null\n");
参考技术B memset是初始化send指针指向的内存,send指针本身存储在另外一个地方,如果send==NULL,要memset函数做什么。。

在指向数组的指针上调用 memset?

【中文标题】在指向数组的指针上调用 memset?【英文标题】:Calling memset on pointer to array? 【发布时间】:2013-10-21 15:57:35 【问题描述】:

我不认为我在这里理解了什么......

bool (*lookup)[100];
memset(lookup, 0, 100 * sizeof(*lookup));

我正在尝试初始化一个指向堆栈分配数组的指针(该指针只会传递给堆栈框架内的调用)。 memset 用于将数组初始化为 0。

前面的代码导致segfault,memset不喜欢指针吗?

【问题讨论】:

堆栈分配数组”在哪里? memset 喜欢指针就好了;如果您在指针占用的内存上调用它,memset(&loopkup, 0, sizeof(lookup)); 代码将是有效的(尽管有些毫无意义)。如所写,您使用从未初始化的指针变量中检索到的 indeterminate 地址调用它,因此这是未定义的行为。 传递给memset的大小必须与指针指向的对象一致。发布的代码具有未定义的行为,因为指针未初始化,否则发布初始化指针的代码。 【参考方案1】:

通过做

memset(lookup, 0, 100 * sizeof *lookup);

你没有“初始化一个指针”而是指针lookup指向的内存。

而且很可能在调用memset() 之前,您没有将指针指向某个有效内存,因此写入随机内存会调用未定义的行为,从而导致程序崩溃。

有几种方法可以获得有效内存。

像这样从堆栈中获取它:

bool lookup_instance[100] = 0;
bool (*lookup)[100] = &lookup_instance;
/* No need to memset it to 0s as this had been done by ... = 0 already. */

或者像这样自己获取:

bool (*lookup)[100] = malloc(sizeof *lookup);
if (NULL == lookup) 

  perror("malloc() failed"):

else

  memset(lookup, 0, sizeof *lookup);

最短的解决方案是:

bool (*lookup)[100] = calloc(1, sizeof *lookup);
if (NULL == lookup) 

  perror("calloc() failed");

else

  /* No need to memset it to 0s as this has been done by calloc() already. */

【讨论】:

但是100* 没有意义,因为sizeof 已经获得了数组的大小,而不是成员。 @rodrigo: Huu .. 是我写的吗?一定是暂时的脑筋急转弯……还是谢谢!已更正! @rodrigo:啊,知道了,我从 OP 那里复制的。该死的复制和粘贴编程......: 我的印象是 bool (*lookup)[100];分配一个数组并返回一个指向其第一个元素的指针。 @jab: 不,它是一个指针变量,其中指向的类型是bool[100]

以上是关于memset初始化指针指向的主要内容,如果未能解决你的问题,请参考以下文章

C结构体成员初始化memset

memset用法总结

memset函数

memset()函数

memset用法详解

memset函数