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空地址
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初始化指针指向的主要内容,如果未能解决你的问题,请参考以下文章