sizeof和strlen

原创 2015年07月08日 20:10:05

这几天一直在忙着写大作业,实现了一个哈夫曼树编解码,其中用到了像文件中写入字符对应的字符串的编码时,我是现将编码串写到一个char 类型的buf数组里,然后对该buf压缩,像buf中复制时,我使用的memcpy函数,MSDN上关于这个函数的原型是:

void *memcpy( void *dest, const void *src, size_t count);
<p class="label"><strong>Return Value</strong>
</p><p><strong>memcpy</strong> returns the value of <em>dest.</em>
</p><p class="label"><strong>Parameters</strong>
</p><p class="dt"><em>dest  </em>New buffer</p><p class="dt"><em>src   </em>Buffer to copy from</p><p class="dt"><em>count </em>Number of characters to copy</p><p class="label"><strong>Remarks</strong></p><p class="label">The <strong>memcpy</strong> function copies <em>count</em> bytes of <em>src</em> to 
<em>dest.</em> If the source and destination overlap, this function does not 
ensure that the original source bytes in the overlapping region are copied 
before being overwritten. Use <strong>memmove</strong> to handle overlapping regions.</p>

当最初我是这样写的

memcpy(buf, ch_code[i].codeStr, sizeof(ch_code[i].codeStr));

然后将buf中的数据写入到文件中,虽然写入的时候没有错误,但是解码的时候,直接就崩了,起初还找不到原因,只好单步调试了,当执行到这里的时候,ch_code[i]是"00001"这一句执行之后,本来预计的buf中的内容应该为"00001"但是,看到的却是"0000"这才突然想起来,是误用了sizeof。

sizeof返回一个对象或者类型的字节数,MSDN上是这么定义的

The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.
The expression is either an identifier or a type-cast expression (a type specifier enclosed in parentheses).
When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof returns the size of the entire array. The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.

总结位一下几点:

  • 对于系统的基本类型,则返回该变量所对应的类型的长度
  • 对于数组,则返回数组的长度
  • 对于指针变量,则直接返回指针变量对于的长度(32位机中,返回4,;64位机种返回8)
  • 对于结构体类型,要特别注意,字节对齐

所以当要对指针操作时,直接用strlen吧,别自己给自己挖坑了~~哭哭

将代码中相应的地方改为

memcpy(buf, ch_code[i].codeStr, strlen(ch_code[i].codeStr));
再次运行,成功啦~~~





相关文章推荐

Sizeof与Strlen的区别与联系

  • 2014年02月25日 20:29
  • 17KB
  • 下载

strlen和sizeof的区别

一、sizeof     sizeof(...)是运算符,而不是一个函数。     一个简单的例子: int a; cout     在头文件中typedef为unsigned int,其值...

sizeof和strlen的区别

  • 2015年02月04日 15:48
  • 5KB
  • 下载

sizeof和strlen的区别

  • 2014年11月27日 23:41
  • 29KB
  • 下载

关于 strlen 与 sizeof 的区别

关于 strlen 与 sizeof 的区别,我相信很多人都有所了解。以下我总结了几点关于strlen 与 sizeof 的区别和注意事项。 1. strlen 是函数,sizeof 是运算符。 2....

Sizeof与Strlen的区别与联系

  • 2012年08月08日 22:37
  • 17KB
  • 下载

strlen与sizeof

  • 2013年12月17日 09:26
  • 48KB
  • 下载

c语言标识符,数据类型,sizeof和strlen区别及面试题

1.所谓标识符,就是你起的一个名字。c/c++中,是你用来标识变量名、符号常量名、函数名、数组名、文件名、类名、对象名等的。(就好像你父母有了你以后给你起的名字)~~ c/c++有效标识符的构成规则如...

sizeof与strlen区别详解

  • 2014年05月19日 22:15
  • 28KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sizeof和strlen
举报原因:
原因补充:

(最多只允许输入30个字)