LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1768|回复: 10

c语言中一个string指针所分配空间的大小信息存放到哪里了?

[复制链接]
发表于 2006-2-10 11:30:30 | 显示全部楼层 |阅读模式

char *aa;
aa=strdup("hello");
aa所分配空间的大小信息放到哪里了?
发表于 2006-2-10 11:41:49 | 显示全部楼层
字符串的末尾有‘\0’,这样可以得到长度。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-10 12:00:51 | 显示全部楼层
sorry,我没说清楚,我指的是大小size,而不是string长度strlen
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-10 12:02:47 | 显示全部楼层
如果我把一个string中的某字符变成'\0',后面的部分占用空间就被自动释放了?
回复 支持 反对

使用道具 举报

发表于 2006-2-10 12:13:11 | 显示全部楼层
后面的不会自动释放
回复 支持 反对

使用道具 举报

发表于 2006-2-10 12:42:42 | 显示全部楼层
长度在malloc分配的内存块里
回复 支持 反对

使用道具 举报

发表于 2006-2-10 13:15:32 | 显示全部楼层
在 C 的字符串中根本没有其长度信息, 其长度是通过最后的 '\0' 来标识的,
但这只是一个约定. 而且, C 中并没有自动释放内存的概念, 即使在一个字符串
中把其中间的一个字符置为 '\0', 这也不能阻止你访问其后的字符, 而且其后的
字符所占的空间(可能是由编译器分配, 也可能是动态分配)也不会因此而被自动释放.

看来楼主需要系统的学习/补习一下 C 及其标准库的知识.
回复 支持 反对

使用道具 举报

发表于 2006-2-10 14:46:55 | 显示全部楼层
大家误会了
楼主问的实际上是glibc的heap段的内存管理机制
malloc(strdup使用了malloc)的时候必然会记录所分配的内存区域的大小
不过这个问题没有什么意义
不同的libc实现都不一样
programming  from ground up里有一章讲解了一个很简单的实现,可以看看

不过楼主的问题有误导性,malloc分配的内存不一定只用来存string,也不是只有strdup才用malloc
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-10 14:58:54 | 显示全部楼层
所分配内存的大小值 没有被放到指针aa中?

char *aa;
aa=strdup("hello");
aa[2]='\0';
后怎样知道给aa分配内存的大小?
回复 支持 反对

使用道具 举报

发表于 2006-2-10 15:04:52 | 显示全部楼层
指针就是一个内存地址
内存大小当然不在里面

可以知道,不过会比较麻烦,因为你必须知道你的libc的实现里,malloc分配的内存大小在哪里保存
所以一般没必要知道
不过可以保证的是
free(aa)一定释放掉
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表