sizeof vs strlen

来源:互联网 发布:淘宝网站主要功能 编辑:程序博客网 时间:2024/04/27 15:03

本文转自:http://hi.baidu.com/fanjialin17/blog/item/88793d11678320cda6ef3f79.html

 

char c[] = “abc/0cba”;

问题1:sizeof(c) = ?                                          
问题2:strlen(c) = ?
问题3:执行free(c);之后会有什么后果?

后来在linux+gcc上写了个小程序测试:
code:
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
char c[] = "abc/0cba";
printf("sizeof(c)=%d/n", sizeof(c));
printf("strlen(c)=%d/n", strlen(c));

free(c);
return 0;
}

result:
sizeof(c)=8
strlen(c)=3
*** glibc detected *** ./a.out: free(): invalid pointer: 0xbfa0209c ***
======= Backtrace: =========
/lib/libc.so.6[0x89d394]
/lib/libc.so.6(cfree+0x96)[0x89f346]
./a.out[0x8048480]
/lib/libc.so.6(__libc_start_main+0xe5)[0x8446d5]
./a.out[0x8048391]
======= Memory map: ========
00110000-00111000 r-xp 00110000 00:00 0          [vdso]
00809000-00829000 r-xp 00000000 fd:00 7603375    /lib/ld-2.9.so
0082a000-0082b000 r--p 00020000 fd:00 7603375    /lib/ld-2.9.so
0082b000-0082c000 rw-p 00021000 fd:00 7603375    /lib/ld-2.9.so
0082e000-0099c000 r-xp 00000000 fd:00 7603401    /lib/libc-2.9.so
0099c000-0099e000 r--p 0016e000 fd:00 7603401    /lib/libc-2.9.so
0099e000-0099f000 rw-p 00170000 fd:00 7603401    /lib/libc-2.9.so
0099f000-009a2000 rw-p 0099f000 00:00 0
05e04000-05e11000 r-xp 00000000 fd:00 7603424    /lib/libgcc_s-4.3.2-20081105.so.1
05e11000-05e12000 rw-p 0000c000 fd:00 7603424    /lib/libgcc_s-4.3.2-20081105.so.1
08048000-08049000 r-xp 00000000 fd:00 753674     /home/colin/workdir/test/a.out
08049000-0804a000 rw-p 00000000 fd:00 753674     /home/colin/workdir/test/a.out
09030000-09051000 rw-p 09030000 00:00 0          [heap]
b7eee000-b7ef0000 rw-p b7eee000 00:00 0
b7f04000-b7f05000 rw-p b7f04000 00:00 0
bf9ef000-bfa04000 rw-p bffeb000 00:00 0          [stack]

后来上网认真学了一下sizeof 和strlen的区别:
本质上而言,sizeof是一个运算符,它用类型作为参数,而strlen只是C库提供的一个函数,他用来计算以’/0’结果的字符串的长度,即它的参数只能是char*。它们相同的地点就只是返回值,都是一个size_t类型的值。
strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,而sizeof的结果是在编译的时候就计算过的,是类型或变量占内存的大小。
注意:sizeof计算的是类型或者变量占内存的大小。

strlen函数的libc的实现

sizeof