读书人

帮忙看C程序的有关问题

发布时间: 2012-03-03 15:33:03 作者: rapoo

帮忙看C程序的问题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
1。char *sdp = new char[300] ;

if (sdp ==NULL)
{
return;
}
2。printf( "sdplen=%d\n ",strlen(sdp));

sprintf(sdp, "%s ", "peng\r\n ");

char *sdp1 =sdp;
sdp1 +=strlen(sdp);
sprintf(sdp1, "%s ", "m=video 0 RTP/AVP 96\r\na=rtpmap:96 MP4V-ES/90000\r\na=fmtp:96 profile-level-id=3;config=00000100000001200086c400670c161048518f\r\na=control:trackID=1\r\n ");

printf( "sdplen=%d\n ",strlen(sdp));

char *sdp2 =sdp;
sdp2 +=strlen(sdp);
sprintf(sdp2, "%s ", "m=audio 0 RTP/AVP 97\r\na=rtpmap:97 AMR/8000\r\na=fmtp:97 octet-align=1\r\na=control:trackID=2\r\n ");

printf( "sdplen=%d\n ",strlen(sdp));

printf( "sdp=%s\n ",sdp);

delete sdp;

system( "pause ");

return;

}

问题:第1。行为char *sdp = new char[300] ;但是 第2。行打印出的sdp len 竟然是sdp len=304

为什么不是300而是304呢?那么我在后面通过sprintf函数能向sdp中填充的字节数应该是不多于多少呢?

若改为char *sdp = new char[1000] ;第2。行打印出的sdp len 竟然是sdp len=1016

这是怎么回事呢?为什么总比申请的空间要大,但又不是增加固定大小?



[解决办法]
strlen只是计算字符串长度的
不是计算分配的内存空间
他遇到 '\0 '结束
而你分配的空间未初始化
里面的内容是不确定
具体和编译器有关

你可以用sizeof来计算数组的大小
[解决办法]
strlen(sdp)计算的是字符串的长度,字符串的长度计算是以 '\0 '为结尾
因此strlen(sdp)不会在乎是否分配空间以及分配空间长度,只计算从开始地址到第一次遇到 '\0 '的长度
你可以赋值*(sdp+299)=0;则strlen(sdp) <=299;
[解决办法]
1。char *sdp = new char[300] ;

if (sdp ==NULL)
{
return;
}
2。printf( "sdplen=%d\n ",strlen(sdp));
我要说的是,你在1-2之间没有为字符串(C++ new 动态分配)设置字符串结束符。
new和C中的malloc、calloc、realloc只负责分配内存,但是不会为你负责初始化。
所以对于2执行时,sdp指向的字符串由于没有显示指定字符串结束符 '\0 '(C,C++对于C风格的字符串是根据字符串结束符 '\0 '判断一个字符串的结束的),这时,编译器会从开始位置直到找到一个 '\0 '为止,一般情况下内存中会有很多值为0(对应 '\0 '的ASCII值),所以一般会输出这个字符串,只不过可能超过该字符串被分配的内存空间。
对于你的结果如此,是因为内存中的 '\0 '分配是随机的,该程序每次运行该字符串获得内存空间位置又是随即的,所以结果自然很难预料。

[解决办法]
To:yecheng_110()
“你可以用sizeof来计算数组的大小”
我要说的是sizeof(array)得到的值是sizeof(type_of_array)
例如
char a[100];
sizeof(a)==sizeof(char)

[解决办法]
其它的个人支持
guochun(yingc)
正解。

读书人网 >C语言

热点推荐