鱼C论坛

 找回密码
 立即注册
查看: 5441|回复: 48

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

[复制链接]
发表于 2018-8-20 11:45:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
贴上代码:

       
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void main()
{
        char *buf = NULL;
        const char *str = "   i am student, you are teacher   ";
        buf = (char *)malloc(sizeof(str) * 2);
        memset(buf, 0, sizeof(buf));
        strcpy(buf, str);


        printf("buf:%s \n", buf);
        free(buf);
        buf = NULL;
}
       
编译器使用的是微软visual studio 2012版本.
问题:printf打印的时候总是触发断点,进入到malloc.c文件的_heap_alloc(size_t size)函数中.个人感觉buf指针作为堆上内存空间的指针,在strcpy函数之前buf指针并没有改动,问题可能出现在strcpy方面,求大神帮忙解答!!!!!
最佳答案
2018-8-20 12:27:29
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main()
{
        char *buf = NULL;
        const char str[] = "   I am student, you are teacher   ";
        buf = (char *)malloc(sizeof(str));
        memset(buf, 0, sizeof(buf));
        strcpy(buf, str);

        printf("buf: %s\n", buf);
        free(buf);
//        buf = NULL;        // 已经 free 了,怎么还用??
        return 0;
}
      
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-20 11:50:48 | 显示全部楼层

sizeof(*str)中的*str作为指针变量,只占有4个字节,乘上2后,只有8个字节,放不下字符串大小.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 11:53:06 | 显示全部楼层

试过了,还是在printf函数那边失败
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 12:24:39 | 显示全部楼层

strlen只是求出字符串的长度,不包含'\0'隐含字符,sizeof计算的是C风格的字符串长度,包含'\0',如果使用strlen,打印出来后面会有乱码.
但是现在关键问题不是这个,我现在面临的是malloc分配的内存问题,怀疑buf指针被改动了,但是一直找不到原因.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 13:06:38 | 显示全部楼层
claws0n 发表于 2018-8-20 12:27
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

终于找到原因了,我混肴了指针和内存空间以及数组名的区别.
老哥这段程序可以运行的原因,老哥用一个字符数组将全局区字符串拷贝到栈区保存,sizeof(str)此时计算的是数组中字符串大小.
而我的代码失败原因,是一直计算sizeof(str)这个str指针类型,所以错误.
至于//        buf = NULL;        // 已经 free 了,怎么还用?
这一句,是为了杜绝野指针.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 13:08:14 | 显示全部楼层
人造人 发表于 2018-8-20 12:31
"sizeof计算的是C风格的字符串长度"

你告诉我,是谁告诉你的?

这个我依然坚持我的意见,你可以运行以下下面的代码:
void main()
{
        char buf[] = "123456";
        printf("%d\n", strlen(buf));
        printf("%d\n", sizeof(buf));

        system("pause");
}
两句打印出来的长度不一样,因为有隐含字符'\0'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 13:13:40 | 显示全部楼层
TyCk 发表于 2018-8-20 13:12
指针变量的sizeof值与指针所指的对象没有任何关系,数组的sizeof值等于数组所占用的内存字节数。

这里分 ...

是的,已经发现问题了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 13:21:51 | 显示全部楼层

我没有一开始就划分数组大小,只是为了区分strlen和sizeof针对计算字符串大小方面的区别.
当然,sizeof作为类型操作符,它的功能不仅仅可以用来计算字符串大小.
我想要表达的问题是,strlen计算的字符串长度不是C风格的字符串长度,而sizeof计算的字符串长度是C风格的字符串长度.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

以'\0'结尾的字符串,'\0'是隐含字符,一般打印字符串就是以'\0'作为结束判断.
包括老哥自己代码中的malloc(len+1),其中哪个多分配的1个字节就是保存隐含字符'\0'.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

sizeof的组要作用是用来做类型计算的,包括中文的名称也是类型操作符.
如果你已经定义了100字节大小的字符串数组,sizeof计算的是数组这个复杂类型的类型大小
而strlen的作用只能用来计算字符串大小
我不知道这样说能不能让你明白.
小甲鱼最新课程 -> https://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,也就认为是初始化内存空间.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

嗯嗯,这个我知道
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

老哥,我对于你说的这一部分内容是非常赞成的.
其实,我的代码根本问题就是,我弄混了指针变量和内存空间变量的区别.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 14:28:17 | 显示全部楼层
无符号整形 发表于 2018-8-20 14:22
对呀……我就怀疑你是计算到了指针大小
结果那样也没用

老哥之前那个答案说改用sizeof(*buf),是计算一个char类型的大小,也就是一个字节
当时我一心认为strcpy那边出现问题,sizeof那么没细看.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-3 05:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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