鱼C论坛

 找回密码
 立即注册
查看: 2652|回复: 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;
}
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-20 11:47:39 | 显示全部楼层
sizeof(*str)试试?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

sizeof(*str)中的*str作为指针变量,只占有4个字节,乘上2后,只有8个字节,放不下字符串大小.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 11:51:41 | 显示全部楼层
匡吉 发表于 2018-8-20 11:50
sizeof(*str)中的*str作为指针变量,只占有4个字节,乘上2后,只有8个字节,放不下字符串大小.

试试?

点评

实在看不出任何问题  发表于 2018-8-20 11:51
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

试过了,还是在printf函数那边失败
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 12:21:16 | 显示全部楼层
匡吉 发表于 2018-8-20 11:53
试过了,还是在printf函数那边失败

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

使用道具 举报

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

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

使用道具 举报

发表于 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;
}
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 12:30:10 | 显示全部楼层
匡吉 发表于 2018-8-20 12:24
strlen只是求出字符串的长度,不包含'\0'隐含字符,sizeof计算的是C风格的字符串长度,包含'\0',如果使用str ...
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main(void)
  5. {
  6.         const char *str = "   i am student, you are teacher   ";
  7.         int len = strlen(str);
  8.         char *buf = malloc(len + 1);
  9.        
  10.         buf[0] = '\0';
  11.         strcpy(buf, str);

  12.         printf("buf:%s \n", buf);
  13.        
  14.         free(buf);
  15.         buf = NULL;
  16.         return 0;
  17. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 12:31:37 | 显示全部楼层
匡吉 发表于 2018-8-20 12:24
strlen只是求出字符串的长度,不包含'\0'隐含字符,sizeof计算的是C风格的字符串长度,包含'\0',如果使用str ...

"sizeof计算的是C风格的字符串长度"

你告诉我,是谁告诉你的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 12:38:26 | 显示全部楼层
抱歉,第11行多余
修正后的代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main(void)
  5. {
  6.         const char *str = "   i am student, you are teacher   ";
  7.         int len = strlen(str);
  8.         char *buf = malloc(len + 1);
  9.        
  10.         strcpy(buf, str);
  11.         printf("buf:%s \n", buf);
  12.        
  13.         free(buf);
  14.         buf = NULL;
  15.         return 0;
  16. }

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

使用道具 举报

发表于 2018-8-20 13:06:27 | 显示全部楼层
匡吉 发表于 2018-8-20 12:24
strlen只是求出字符串的长度,不包含'\0'隐含字符,sizeof计算的是C风格的字符串长度,包含'\0',如果使用str ...
  1.     char str[] = "November";
  2.     printf("Length of String is %d\n", strlen(str));
  3.     printf("Size of String is %d\n", sizeof(str));
复制代码
  1. Length of String is 8
  2. Size of String is 9
复制代码

  1.         char a[] = {"Geeks for"};
  2.         char b[] = {'G','e','e','k','s',' ','f','o','r'};
  3.         cout << "sizeof(a) = " << sizeof(a);
  4.         cout << "\nstrlen(a) = "<< strlen(a);
  5.         cout<<  "\nsizeof(b) = " << sizeof(b);
  6.         cout<<  "\nstrlen(b) = " << strlen(b);
复制代码
  1. sizeof(a) = 10
  2. strlen(a) = 9
  3. sizeof(b) = 9
  4. strlen(b) = 11
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 了,怎么还用?
这一句,是为了杜绝野指针.
想知道小甲鱼最近在做啥?请访问 -> 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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 13:12:13 | 显示全部楼层
指针变量的sizeof值与指针所指的对象没有任何关系,数组的sizeof值等于数组所占用的内存字节数。
  1. const char *str = "   i am student, you are teacher   ";
  2.         buf = (char *)malloc(sizeof(str) * 2);
复制代码

这里分配空间,就有问题了吧,str是指针,sizeof(str)的值为4,哪怕乘以2也只有8个字节,而字符串显然不止8个字节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这里分 ...

是的,已经发现问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 13:14:27 | 显示全部楼层
匡吉 发表于 2018-8-20 13:13
是的,已经发现问题了

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

使用道具 举报

发表于 2018-8-20 13:17:58 | 显示全部楼层
匡吉 发表于 2018-8-20 13:08
这个我依然坚持我的意见,你可以运行以下下面的代码:
void main()
{

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

使用道具 举报

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

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

使用道具 举报

发表于 2018-8-20 13:24:50 | 显示全部楼层
匡吉 发表于 2018-8-20 13:21
我没有一开始就划分数组大小,只是为了区分strlen和sizeof针对计算字符串大小方面的区别.
当然,sizeof作 ...

什么是C风格字符串?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-23 15:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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