⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_40000.htm

📁 vc
💻 HTM
字号:
<p>
序号:40000 发表者:嵇山 发表日期:2003-05-15 08:48:02
<br>主题:内存分配问题
<br>内容:char *test = "www.sohu.com//index.htm";<BR>int size = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;size = strlen(test);<BR>&nbsp;&nbsp;&nbsp;&nbsp;t = (char *)malloc(size);<BR>&nbsp;&nbsp; memcpy(t, test, size);<BR>&nbsp;&nbsp; strcat(t, "//jishan");<BR>&nbsp;&nbsp; free(t);<BR><BR><BR>我看到size = 23,但分配内存的时候,发现分配了27,不知道为什么,<BR><BR>后来我想是对齐的原因,所以在setting改为了1byte,结果还是一样,<BR>不知道什么原因。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:ohye212 回复日期:2003-05-15 09:02:29
<br>内容:有个4个字节的指针
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:罗兹维尔 回复日期:2003-05-15 09:06:23
<br>内容:&nbsp;&nbsp;&nbsp;&nbsp;t = (char *)malloc(size+1);<BR>最后应该加个'/0'<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:嵇山 回复日期:2003-05-15 09:07:08
<br>内容:是不是每一次申请内存的时候都这样,<BR><BR>为什么有时候我申请的时候又没有多出4个字节呢
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:嵇山 回复日期:2003-05-15 09:09:51
<br>内容:char *t = NULL;<BR><BR>size = strlen(test) + 1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;t = (char *)malloc(size);<BR>&nbsp;&nbsp;&nbsp;&nbsp;memset(t, 0x00, size);<BR>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(t, test, size - 1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;//t = (char *)realloc(t, size + strlen("ishan"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//去掉这一行的话,free的时候出错,这里搞不清。<BR>&nbsp;&nbsp;&nbsp;&nbsp;strcat(t, "ishan");<BR>&nbsp;&nbsp;&nbsp;&nbsp;_mkdir(t);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;free(t);<BR><BR><BR>罗滋味儿:<BR>&nbsp;&nbsp;现在照你这样做了,但申请的时候,还是多出4个字节
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:罗兹维尔 回复日期:2003-05-15 09:19:56
<br>内容:我的意思是你在给字符串分配内存的时候要是没给'/0'留位子的话将会导致不可预知的错误<BR><BR>嵇山的意思是不是你在跟踪程序的时候发现<BR>&nbsp;&nbsp; size = strlen(test);//分配了n<BR>&nbsp;&nbsp;&nbsp;&nbsp;char* t = (char *)malloc(size);//分配了n+27<BR>?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:嵇山 回复日期:2003-05-15 09:38:01
<br>内容:是的,<BR>我在跟踪的时候发现有时候会多4个BYTE。<BR><BR>size = strlen(test);//<BR>char* t = (char *)malloc(size);//分配了size + 4<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:罗兹维尔 回复日期:2003-05-15 09:53:19
<br>内容:malloc是在堆内分配内存<BR>char* t 则是在栈内分配内存<BR>你的size + 4是不是指的那里分配的内存
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ax 回复日期:2003-05-15 09:58:50
<br>内容:我不知道你用哪个函数来获得你分配内存的长度的,但你的代码有语法问题,正确的应是:char *test = "www.sohu.com//index.htm";<BR>&nbsp;&nbsp;&nbsp;&nbsp;char * pjs = "//jishan";<BR>&nbsp;&nbsp;&nbsp;&nbsp;int size = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;size = strlen(test);<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 分配足够的空间存储 test,pjs的内容<BR>&nbsp;&nbsp;&nbsp;&nbsp;// + 1是因为字符串以'\0'结尾,而strlen的结果不包括'\0'&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;char * t = (char *)malloc(strlen(test) + strlen(pjs) + 1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 有现成的字符串copy函数不必用memcpy<BR>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(t, test);<BR>&nbsp;&nbsp;&nbsp;&nbsp;strcat(t, "//jishan");<BR>&nbsp;&nbsp;&nbsp;&nbsp;free(t);
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:嵇山 回复日期:2003-05-15 10:21:53
<br>内容:谢谢,罗滋味儿<BR><BR>谢谢 ax,<BR>谢谢 ohye212,<BR><BR>我没有用数组,应该是在堆内分配内存吧。我奇怪的是跟踪的时候为什么<BR>会多分配出4byte。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zhang2003 回复日期:2003-05-17 17:19:53
<br>内容:<BR>VC在进行动态内存分配时,为了安全会多分配额外的字节并赋予特殊的值用于越界检测(据我所知在FREE时会进行越界检测)而<BR>&nbsp;&nbsp;&nbsp;&nbsp;//t = (char *)realloc(t, size + strlen("ishan"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//去掉这一行的话,free的时候出错,这里搞不清。<BR>是因为你在执行<BR>&nbsp;&nbsp;&nbsp;&nbsp;strcat(t, "ishan");<BR>&nbsp;&nbsp;&nbsp;&nbsp;时破坏了堆内存,而在FREE时进行检测时会出现ASSERT错误<BR>这也说明了<BR>你看到size = 23,但分配内存的时候,发现分配了27,不知道为什么的原因<BR>你可以自己跟踪内存看看<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zhang2003 回复日期:2003-05-17 17:23:59
<br>内容:<BR>VC在进行动态内存分配时,为了安全会多分配额外的字节并赋予特殊的值用于越界检测(据我所知在FREE时会进行越界检测)而<BR>&nbsp;&nbsp;&nbsp;&nbsp;//t = (char *)realloc(t, size + strlen("ishan"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//去掉这一行的话,free的时候出错,这里搞不清。<BR>是因为你在执行<BR>&nbsp;&nbsp;&nbsp;&nbsp;strcat(t, "ishan");<BR>&nbsp;&nbsp;&nbsp;&nbsp;时破坏了堆内存,而在FREE时进行检测时会出现ASSERT错误<BR>这也说明了<BR>你看到size = 23,但分配内存的时候,发现分配了27,不知道为什么的原因<BR>你可以自己跟踪内存看看
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -