首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 用memset()给字符串指针赋值的问题 [已结贴,结贴人:sunnycrystal_2008]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 21:59:00 楼主
    我写了这样一段代码:
    unsigned char *tt;(tt已经被分配了一段内存空间,长度为len, 且值为0)
    memset(tt, 0, len);
    编译时没错,但是程序运行到memset函数时就崩了,这是为什么呢?难道memset不能给已经是“0”的字符串再清空?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:00:391楼 得分:0
    把tt如何分配的写出来看看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iu_81
    • 等级:
    发表于:2008-05-08 22:06:572楼 得分:0
    没有错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:07:473楼 得分:0
    C/C++ code
    #include <stdio.h> #include <stdlib.h> #include <string.h> void main() { unsigned char *tt; // tt已经被分配了一段内存空间,长度为len, 且值为0 tt = (unsigned char*)calloc(10, sizeof(unsigned char)); memset(tt, 0, 10); }


    测试了一下,没有问题啊:)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:11:214楼 得分:0
    C/C++ code
    int len = 10; unsigned char *tt = new unsigned char[len]; memset(tt, 0, len); memset(tt, 0, len); memset(tt, 0, len);

    随便多少次、、、、
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:16:155楼 得分:0
    我先定义了一个结构如:
    typedef struct 
    {
     unsigned char* Name;
     bool Need;
     bool NeedBuf;
     int Type;
    }DEF_PARAM, *PRT_DEF_PARAM;

    PRT_DEF_PARAM dd;
    unsigned char *tt;
    dd = (PRT_DEF_PARAM )malloc(4096);
    memset(dd, 0, 4096);
    tt = dd->Name;
    memset(tt, 0, 32);

    类似于这样了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:36:256楼 得分:0
    没有人帮忙了吗??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:39:497楼 得分:0
    unsigned char* Name; 
    这个分配了空间没有。。。。。。


    如果分配了,建议试试:ZeroMemory
    VOID ZeroMemory(
      PVOID Destination, 
                     // address of block to fill with zeros
      DWORD Length   // size, in bytes, of block to fill with zeros
    );


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iu_81
    • 等级:
    发表于:2008-05-08 22:43:388楼 得分:0
    tt没有分配空间 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:48:139楼 得分:0
    tt的指针已经指向dd->Name了,调试的时候我能看到tt的地址跟内存,内存都是0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 22:49:3110楼 得分:0
    为什么要用ZeroMemory,它跟memset有什么区别吗??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 23:03:4711楼 得分:0
    6楼说的很清楚了,unsigned char* Name 没有分配空间,用tt指它还不是等于tt没有分配空间
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 23:04:5312楼 得分:0
    C/C++ code
    typedef struct { unsigned char Name[20];//这里最好用数组 bool Need; bool NeedBuf; int Type; }DEF_PARAM, *PRT_DEF_PARAM;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fengdream
    • 等级:
    发表于:2008-05-08 23:11:5613楼 得分:0
    看看别的地方是不是已经释放了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 23:20:3414楼 得分:0
    引用 8 楼 iu_81 的回复:
    tt没有分配空间


    指针问题最忌讳的就是不分配空间。估计是这错了吧。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • redeg
    • 等级:
    发表于:2008-05-08 23:30:0515楼 得分:20
    dd = (PRT_DEF_PARAM )malloc(4096); 
    这个只是指向结构体的指针,在你的结构体里还有Name 这个指针.
    你没有给name分配空间,所以会崩溃.
    还有,你为什么要给结构体分配4096字节的空间?用sizeof(DEF_PARAM)不是更好吗?
    建议:
    dd = (PRT_DEF_PARAM )malloc(sizeof(DEF_PARAM)); 
    dd->Name = (unsigned char* )malloc(你想分配的空间大小);
    tt = dd->Name;
    但是如果dd->Name已经被free()了..再memset就会出错..
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-08 23:32:1116楼 得分:0
    引用 14 楼 superhackerzhang 的回复:
    引用 8 楼 iu_81 的回复:
    tt没有分配空间

    指针问题最忌讳的就是不分配空间。估计是这错了吧。

    就是这个原因了!不用估计,一定是这个原因了。
    dd = (PRT_DEF_PARAM )malloc(4096); 
    这个malloc也很奇怪啊, 为什么用4096啊。
    一般都用malloc(sizeof(DEF_PARAM) * count)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 09:45:0917楼 得分:0
    你只是给 结构分配了空间,但是结构里面的指针,你没有分配空间,也就是unsigned char* Name; 
    并没有分配空间,再用tt指向它,tt也没有分配空间,所以出错了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 09:58:5718楼 得分:0
    以后就直接点,把代码帖出来

    找问题方便多了

    连空间都没分配还说已经分配了

    瞎猜有啥猜的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 10:15:0819楼 得分:0
    LS太经典了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 11:43:5220楼 得分:0
    引用 18 楼 Treazy 的回复:
    以后就直接点,把代码帖出来 

    找问题方便多了 

    连空间都没分配还说已经分配了 

    瞎猜有啥猜的

    呵呵,有时候的确如此:)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 11:48:1221楼 得分:0
    呵呵,如同把没用的钥匙给别人说,帮我把屋子打扫一下, but where is the house?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 11:53:0822楼 得分:0
    他应该明白了,哈哈:)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 12:48:0423楼 得分:0
    应该是 len -1吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 12:49:4324楼 得分:0
    哦,看错了,不对。len 对着。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 12:50:4225楼 得分:0
    但是在用memset的时候最后一个参数应该是 sizeof(type) × len吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 13:10:5726楼 得分:0
    同意上楼说法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 13:15:0527楼 得分:0
    这是我修改好的,还测试了一下,可以运行了。主要就是你在用memset的时候没有10*sizeof(unsigned char),所以肯定不对了,行为不确定。
    #include  <stdio.h>

    #include  <stdlib.h>
    #include  <string.h>
    #include  <iostream>
    #include  <malloc.h>
    using namespace std;

    int _tmain(int argc, _TCHAR* argv[])
    {
    unsigned char *tt; // tt已经被分配了一段内存空间,长度为len, 且值为0
        tt = (unsigned char*)calloc(10,sizeof(unsigned char));
        memset(tt, 'c', 10*sizeof(unsigned char)); 
    cout < <*(tt+5) < <endl;
    return 0;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 13:28:5028楼 得分:0
    PRT_DEF_PARAM dd;   
    unsigned char *tt;
    dd = (PRT_DEF_PARAM )malloc(4096); //错误,不能随意指定大小,危险!应改为
                                                    //dd = (PRT_DEF_PARAM )malloc(sizeof(DEF_PARAM))
    memset(dd, 0, 4096);   //改为memset(dd, 0, sizeof(DEF_PARAM));
    tt = dd->Name;        //这时并没有为dd->Name分配该指针所要指向的内存空间,
        //假如分配100个字符长度,改为dd->Name=(unsigned char*)(malloc(100*sizeof(unsigned char)))
    memset(dd->Name, 0, 100*sizeof(unsigned char));
    //最好养成使用sizeof获取长度的习惯。在32位机和64位机下,相同类型的数据长度并不同


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 13:28:5329楼 得分:0
    C/C++ code
    改法1 #include "stdlib.h" typedef struct { unsigned char Name[32]; bool Need; bool NeedBuf; int Type; }DEF_PARAM, *PRT_DEF_PARAM; int main() { PRT_DEF_PARAM dd; unsigned char *tt; dd = (PRT_DEF_PARAM )malloc(sizeof(DEF_PARAM)); memset(dd, 0, sizeof(DEF_PARAM)); return 0; } 改法2 #include "stdlib.h" typedef struct { unsigned char* Name; bool Need; bool NeedBuf; int Type; }DEF_PARAM, *PRT_DEF_PARAM; int main() { PRT_DEF_PARAM dd; unsigned char *tt; dd = (PRT_DEF_PARAM )malloc(sizeof(DEF_PARAM)); memset(dd, 0, sizeof(DEF_PARAM)); dd->Name = (unsigned char*)malloc(sizeof(char) * 32); tt = dd->Name; memset(tt, 0, sizeof(char) * 32); return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 14:37:2630楼 得分:0
    1. 原因只有一个,就是结构里面的Name没有分配空间
    2. 就是malloc是的4096确实不妥 sizeof更合理
    3. 多提供些信息
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 16:53:2131楼 得分:0
    应该注意:malloc是的4096确实不妥 sizeof更合理 
    dd = (PRT_DEF_PARAM )malloc(4096);  
    这个只是指向结构体的指针,在你的结构体里还有Name 这个指针. 
    你没有给name分配空间,所以会崩溃. 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 20:11:2932楼 得分:0
    typedef struct 
    {
     unsigned char* Name;
     bool Need;
     bool NeedBuf;
     int Type;
    }DEF_PARAM, *PRT_DEF_PARAM;

    PRT_DEF_PARAM dd;
    unsigned char *tt;
    dd = (PRT_DEF_PARAM )malloc(4096);
    memset(dd, 0, 4096);
    tt = dd->Name;                      // dd->Name not alloc memory
    memset(tt, 0, 32);                  // so crash...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 22:15:5333楼 得分:0
    tt没有分配空间.http://shop35222655.taobao.com/
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天