鱼C论坛

 找回密码
 立即注册
楼主: 匡吉

[已解决]malloc内存方面的问题

[复制链接]
 楼主| 发表于 2018-8-20 13:29:49 | 显示全部楼层
人造人 发表于 2018-8-20 13:24
什么是C风格字符串?

以'\0'结尾的字符串,'\0'是隐含字符,一般打印字符串就是以'\0'作为结束判断.
包括老哥自己代码中的malloc(len+1),其中哪个多分配的1个字节就是保存隐含字符'\0'.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 13:35:42 | 显示全部楼层
匡吉 发表于 2018-8-20 13:29
以'\0'结尾的字符串,'\0'是隐含字符,一般打印字符串就是以'\0'作为结束判断.
包括老哥自己代码中的mallo ...

数组a的大小是100个字节,a数组中的C风格字符串的长度是12
sizeof得到的是数组的长度,不是字符串的长度



1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 13:36:30 | 显示全部楼层
人造人 发表于 2018-8-20 13:24
什么是C风格字符串?

没有边界检查的字符串?

sizeof() 这是直接看数据所霸占的内存空间
strlen() 这是会去找 '\0' 吧
这样理解?

好奇一下,最后 free(buf) 被释放之后,为什么还可以引用?memset() 的时候,空间被扩充,而 free() 只是释放那些被扩充的位置??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 13:39:15 | 显示全部楼层
匡吉 发表于 2018-8-20 13:29
以'\0'结尾的字符串,'\0'是隐含字符,一般打印字符串就是以'\0'作为结束判断.
包括老哥自己代码中的mallo ...

你这么写,数组a的长度就是13个字节
strlen当然是12

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 13:41:12 | 显示全部楼层
人造人 发表于 2018-8-20 13:35
数组a的大小是100个字节,a数组中的C风格字符串的长度是12
sizeof得到的是数组的长度,不是字符串的长度 ...

sizeof的组要作用是用来做类型计算的,包括中文的名称也是类型操作符.
如果你已经定义了100字节大小的字符串数组,sizeof计算的是数组这个复杂类型的类型大小
而strlen的作用只能用来计算字符串大小
我不知道这样说能不能让你明白.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 13:42:18 | 显示全部楼层
匡吉 发表于 2018-8-20 13:29
以'\0'结尾的字符串,'\0'是隐含字符,一般打印字符串就是以'\0'作为结束判断.
包括老哥自己代码中的mallo ...

sizeof得到的是数组的大小
strlen得到的是字符串的大小
数组的大小可以等于字符串的大小+1,但这只是一种特殊情况,是在数组空间最小的时候
数组空间可以很大,但是字符串以'\0'结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 13:44:52 | 显示全部楼层
claws0n 发表于 2018-8-20 13:36
没有边界检查的字符串?

sizeof() 这是直接看数据所霸占的内存空间

free(buf)的作用是清空buf指向的内存空间,不代表buf置为NULL,也就是说free(buf)后的buf依然指向原来的空间,那么问题就出现了,如果进行操作buf指针,那么修改的就不是以前内存空间的内容,也就是野指针的概念.
memset的在我的代码中的作用是为了将分配的buf空间的内容置为0,也就认为是初始化内存空间.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 13:47:21 | 显示全部楼层
匡吉 发表于 2018-8-20 13:41
sizeof的组要作用是用来做类型计算的,包括中文的名称也是类型操作符.
如果你已经定义了100字节大小的字 ...

但是字符串也是数组的一种,一般情况下只会差 1。看用在哪里
但是 12、22 楼就示范出它们在不同情况下会出现的差异
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 13:51:01 | 显示全部楼层
匡吉 发表于 2018-8-20 13:44
free(buf)的作用是清空buf指向的内存空间,不代表buf置为NULL,也就是说free(buf)后的buf依然指向原来的空 ...

嗯嗯,了解~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 13:53:00 | 显示全部楼层
claws0n 发表于 2018-8-20 13:47
但是字符串也是数组的一种,一般情况下只会差 1。看用在哪里
但是 12、22 楼就示范出它们在不同情况下会 ...

如果不是分配了固定大小的数组来说的话,是相差一个字节.
但是数组作为复杂类型,直接使用sizeof(数组名)就可以知道数组大小,而sizeof(指向字符串的指针)的话,一般只能得到4个字节.
12楼的区别可以看看,是正确的.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 13:53:24 | 显示全部楼层

也就是说你没问题了吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 13:55:29 | 显示全部楼层
匡吉 发表于 2018-8-20 13:53
如果不是分配了固定大小的数组来说的话,是相差一个字节.
但是数组作为复杂类型,直接使用sizeof(数组名) ...

http://www.cnblogs.com/wangkangl ... /09/27/2193072.html

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 13:58:31 | 显示全部楼层
匡吉 发表于 2018-8-20 13:53
如果不是分配了固定大小的数组来说的话,是相差一个字节.
但是数组作为复杂类型,直接使用sizeof(数组名) ...


char a[] = "hello world!";
这个数组a的大小是13个字节,这个数组的大小也是固定的
相当于
char a[13] = "hello world!";
如果你不写13,那编译器替你写,就是这样

char a[] = "hello world!";
char a[13] = "hello world!";
在编译器看来,上面两种写法是一样的
你不写,编译器替你写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 14:01:56 | 显示全部楼层
人造人 发表于 2018-8-20 13:58
char a[] = "hello world!";
这个数组a的大小是13个字节,这个数组的大小也是固定的
相当于

嗯嗯,这个我知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 14:05:15 | 显示全部楼层
匡吉 发表于 2018-8-20 14:01
嗯嗯,这个我知道

char a[13] = "hello world!";
数组a的大小是13个字节
sizeof(a) 当然是13了
sizeof得到的是数组的大小
strlen得到的是字符串的大小

数组的大小可以等于字符串的大小+1
但并不是 数组的大小一定等于字符串的大小+1
数组可以很大,也可以等于字符串的大小+1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 14:06:40 | 显示全部楼层
人造人 发表于 2018-8-20 13:53
也就是说你没问题了吧?

勉强接受~

应该说我以为 free 了之后,变量也跟着不见了。我目前遇到的是 free 了 malloc 就退出程序而已。
还是应该这样说:free 把变量的空间缩到最小??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 14:08:46 | 显示全部楼层
人造人 发表于 2018-8-20 14:05
char a[13] = "hello world!";
数组a的大小是13个字节
sizeof(a) 当然是13了

老哥,我对于你说的这一部分内容是非常赞成的.
其实,我的代码根本问题就是,我弄混了指针变量和内存空间变量的区别.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 14:12:56 | 显示全部楼层
匡吉 发表于 2018-8-20 14:08
老哥,我对于你说的这一部分内容是非常赞成的.
其实,我的代码根本问题就是,我弄混了指针变量和内存空间变 ...

嗯,问题解决了就行
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 14:22:29 | 显示全部楼层
匡吉 发表于 2018-8-20 13:06
终于找到原因了,我混肴了指针和内存空间以及数组名的区别.
老哥这段程序可以运行的原因,老哥用一个字符 ...

对呀……我就怀疑你是计算到了指针大小
结果那样也没用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 14:23:34 | 显示全部楼层
人造人 发表于 2018-8-20 13:53
也就是说你没问题了吧?

其实我一直在等您的答案。可是我试了一下,他 27 楼给的答案也不完全吧?
free 只能针对 memset, malloc, realloc, calloc 申请出来的内存空间而已吧?
所以 free 了之后,buf 还拥有原本属于自己的空间,刚好足以赋值为 NULL
这样理解是不是比较合适??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 06:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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