C语言用malloc定义动态字符数组,发现字符数组长度与定义的长度不同

char *pcWholeHead =NULL;
pcWholeHead = (char *)malloc(nEndPos*sizeof(char));//nEndPos为62
if(pcWholeHead== NULL)
return Malloc_ERROR;//malloc failure,return Malloc_ERROR
nTest = strlen(pcWholeHead);//测试发现nTest是80
请问再是什么原因呢?
最新回答
故事与月有关

2024-09-15 13:12:09

内存不是树枝,截断了就不连在一起了。
分配内存,和分地差不多,
分给你一亩地,你种十亩,其实也可以,
不过你用了别人的土地,是要付出代价的。
打架,打官司,乃至被人害了,都是有可能的。
你合法的拥有的可以使用的土地,就只有分给你的那一亩地。
别的都是别人家的。收了别人的庄稼,或者种了别人的地,别人会不高兴的。
至于会出什么状况,看别人有什么反应就知道了。

你分配的内存没有初始化,不知道何处会有个‘\0’;strlen(pcWholeHead)只有找到‘\0’,才会返回串的长度nTest = strlen(pcWholeHead);//测试发现nTest是80,这里明显已经出现越界访问了。
出现这种问题是非常正常的;

要用strlen(pcWholeHead)获取
字符串
的长度,必须确保实参pcWholeHead是个字符串。
分配的这块内存有多大,这应该有记录的,但是这个由编译系统和库去维护,是封装了的,是不会告诉你的。

不要徒劳的去做那些,做不到的事情,如果你学的深入了(至少
编译原理
要学),可以再去研究这个问题。

先要学会合法做事,然后再研究不合法,会出现什么问题。

PS:
pcWholeHead[nEndPos] = 0 ;访问越界了;
应该是pcWholeHead[nEndPos-1] = 0 ;
这样,nTest = strlen(pcWholeHead);应该<=61 ;别指望一定会得到61;当然不会是62,因为要为‘\0’ 留一个空间。

为字符串分配空间,至少,要多分配一个字符的空间。
赏怀

2024-09-15 17:45:10

C语言,数组字符数组要有一个空字符做结束符啊,所以开辟的时候要开辟n*sizeof()+1
追问
嗯,我使用pcWholeHead[nEndPos] = 0;来标记该字符串的结尾,运行结果是对的,但是跳出这个函数的时候系统发出“咚---”的一声,我知道是pcWholeHead[nEndPos] = 0;导致系统发声的,但是为什么呢?这条语句有问题吗?
追答
pcWholeHead[nEndPos] = 0?你加我QQ说说……我表示很感兴趣,一起讨论讨论,互相学习啊!
479292539
Cunese-红玫瑰*

2024-09-15 10:37:25

strlen不是求字符数组的长度,是求里面存的字符串的长度,
字符串以0结尾,到了结尾就当作结束了,而不管你数组多大。
你的情况是正好在长度到80以后遇到0了。你的pcWholeHead里还没保存字符串就用strlen去检测,而且到80,这已经超出了malloc申请的长度,是不安全代码。

另:malloc申请的内存块的大小,除非你熟悉windows的堆的底层管理方式,不然应该是没有什么接口可以获取这个大小的才对。
malloc正常返回以后,它给你的内存块只可能更大不可能更小
等待__经年

2024-09-15 08:26:47

strlen()返回的是字符串长度啊,它是安指针起始到第一个为‘\0’的内存的长度。要计算分配内存大小的函数是_msize函数,包含在malloc.h头文件中。
心头的小情儿

2024-09-15 13:04:09

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。
pcWholeHead仅仅分配了空间,没有赋值,所以这里可能是它第81个为'\0',这个是偶然吧