none
申请的内存包含0xfdfdfdfd RRS feed

  • 问题

  • 在为一个指针申请了空间后,在用时发现地址为0xfdfdfdfd,然后抱错,地址不可用
    比如*p=(char *)malloc(10000)
    结果发现p+554的地址为0xfdfdfdfd
    这个是什么情况会出现阿
    怎么解决阿  
    哪位大虾帮帮忙
    2009年10月8日 12:15

答案

  • 上面的代码没问题。0xfdfdfdfd表明指针位于VC编译器在调试版中额外分配的数据块,也就是说你的p是动态分配而不是像上面那样静态分配,并且你的对象基地址计算错误,使得指针成员位于对象的内存空间之外。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 aqian 2009年10月9日 3:01
    • 取消答案标记 aqian 2009年10月9日 13:51
    • 已标记为答案 aqian 2009年10月12日 1:51
    2009年10月9日 2:51
    版主

全部回复

  • 申请空间后应该用ZeroMemory(p,10000)来设置空值,否则会是随机值的。
    2009年10月8日 12:35
  • 我已经用memset(p,0,10000)过了
    2009年10月8日 13:28
  • 关键是你分配成功了吗?
    do it strive
    2009年10月8日 13:44
  • 申请成功了  

    2009年10月8日 15:20
  • 你的代码只是往p的目标地址写入一个地址,这个地址为你分配的空间。如果你要访问空间第555字节,应该用((BYTE)(*p)+554)。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月8日 17:42
    版主
  • 你的代码只是往p的目标地址写入一个地址,这个地址为你分配的空间。如果你要访问空间第555字节,应该用((BYTE)(*p)+554)。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP

    现在我只是想往p指向的地址上写数据    写的时候告诉我地址不可操作   而不是访问
    另外(*p)+554???  你确定这个是对的  
    *(P+554)才是第555字节得值吧??
    2009年10月9日 2:14
  • 从你的代码来看,p指向的地址是否分配了空间是不确定的。如果你要p指向分配的地址空间,在你的代码中给p而不是p指向的空间赋值。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月9日 2:20
    版主
  • 如果malloc失败的话   返回值应该是NULL阿 
    但是malloc返回的值却不是NULL
    另外我并不是要看P的地址,只是要跟p赋值而已
    只是在赋值失败  用visual studio跟的时候发现在失败的时候
    地址的值是0xfdfdfdfd
    但是为啥在memset的时候没有报错 却在我赋值的时候再报错呢
    这一点相当搞不明白

    2009年10月9日 2:25
  • 从你的代码来看,你没有为p分配空间就往*p写入数据。这个数据是你分配的空间的地址。
    如果你要p指向分配的地址空间,在你的代码中给p而不是p指向的空间赋值。
    给p赋值的方式是p=xxx而不是(*p)=xxxx。


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月9日 2:31
    版主
  • 你的p指针是什么类型的?
    是否malloc分配成功?

    *((char*)p + 554),这个是p后的第554个字节.它的地址为(char*)p + 554.

    地址不可操作是因为你的地址是无效的.0xFD的含义就是你的指针访问越界到了没有分配的虚拟空间.


    还有一点,你用的是debug模式吧?


    0xBAADF00D
    2009年10月9日 2:31
    版主
  • 从你的代码来看,你没有为p分配空间就往*p写入数据。这个数据是你分配的空间的地址。
    如果你要p指向分配的地址空间,在你的代码中给p而不是p指向的空间赋值。
    给p赋值的方式是p=xxx而不是(*p)=xxxx。


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    不好意思  可能是上面的写法有点令你误解了
    代码:
    char *p=(char *)malloc(10000);
    if(NULL == p){
    printf("error\n");
    goto errExit;
    }
    memset(p,0,10000);

    strcpy(p,"fdjfhsfhdjfhdjfh");
    程序运行到strcpy出错,提示内存不可用


    2009年10月9日 2:37
  • 你的p指针是什么类型的?
    是否malloc分配成功?

    *((char*)p + 554),这个是p后的第554个字节.它的地址为(char*)p + 554.

    地址不可操作是因为你的地址是无效的.0xFD的含义就是你的指针访问越界到了没有分配的虚拟空间.


    0xBAADF00D

    不好意思  可能是上面的写法有点令你误解了
    代码:
    char *p=(char *)malloc(10000);
    if(NULL == p){
    printf("error\n");
    goto errExit;
    }
    memset(p,0,10000);

    strcpy(p,"fdjfhsfhdjfhdjfh");
    程序运行到strcpy出错,提示内存不可用
    2009年10月9日 2:38
  • 上面的代码没问题。0xfdfdfdfd表明指针位于VC编译器在调试版中额外分配的数据块,也就是说你的p是动态分配而不是像上面那样静态分配,并且你的对象基地址计算错误,使得指针成员位于对象的内存空间之外。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 aqian 2009年10月9日 3:01
    • 取消答案标记 aqian 2009年10月9日 13:51
    • 已标记为答案 aqian 2009年10月12日 1:51
    2009年10月9日 2:51
    版主
  • 哦  是动态分配的  我上面的p是一个变长结构体指针的成员
    基地址计算错误是指我的结构体的地址计算错误吗?
    2009年10月9日 2:55
  • 是,结构体指针指向的位置并非结构体类型的数据。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月9日 2:58
    版主
  • ok 
    多谢多谢
    等我回去再仔细看看代码 
    现在再上班  不好意思看自己的代码 
    哈哈 
    有问题的话再来请教
    总之多谢以上的各位  
    2009年10月9日 3:01
  • 不好意思  看了半天代码  没有找出原因 
    现在把原代码贴出来 
    大虾们帮忙看看
    在一个while循环里有这么一段:
    if( NULL == loopResultEarnings){
         tmp = loopResultEarnings - *resultEarnings;
         *resultEarnings = (EARNINGS *)realloc(*resultEarnings, (tmp+1000)*sizeof(EARNINGS));
         if(NULL == *resultEarnings){
             printf("getResultEarnings::malloc for loopResultEarnings error!\n");
             goto ErrorExit;
        }   
        loopResultEarnings = *resultEarnings+tmp;
        memset(loopResultEarnings,0,1000*sizeof(EARNINGS));
    }
      
    if(NULL == loopResultEarnings->date){
        loopResultEarnings->date = (char *)malloc(NAME_LENGTH);
        if(NULL == loopResultEarnings->date){
             printf("getResultEarnings::malloc for loopResultEarnings->date error!\n");
             goto ErrorExit;
        }
        memset(loopResultEarnings->date,0,NAME_LENGTH);
    }
      
    strncpy(loopResultEarnings->date, loopStandardStock->date, strlen(loopStandardStock->date));
    就在最后一行的时候抱错了  说内存不可用   看了半天好像没有看出啥问题来 
    难道我形成思维定式了??

    2009年10月9日 13:56
  • 不好意思  看了半天代码  没有找出原因 
    现在把原代码贴出来 
    大虾们帮忙看看
    在一个while循环里有这么一段:
    if( NULL == loopResultEarnings){
         tmp = loopResultEarnings - *resultEarnings;
         *resultEarnings = (EARNINGS *)realloc(*resultEarnings, (tmp+1000)*sizeof(EARNINGS));
         if(NULL == *resultEarnings){
             printf("getResultEarnings::malloc for loopResultEarnings error!\n");
             goto ErrorExit;
        }   
        loopResultEarnings = *resultEarnings+tmp;
        memset(loopResultEarnings,0,1000*sizeof(EARNINGS));
    }
      
    if(NULL == loopResultEarnings->date){
        loopResultEarnings->date = (char *)malloc(NAME_LENGTH);
        if(NULL == loopResultEarnings->date){
             printf("getResultEarnings::malloc for loopResultEarnings->date error!\n");
             goto ErrorExit;
        }
        memset(loopResultEarnings->date,0,NAME_LENGTH);
    }
      
    strncpy(loopResultEarnings->date, loopStandardStock->date, strlen(loopStandardStock->date));
    就在最后一行的时候抱错了  说内存不可用   看了半天好像没有看出啥问题来 
    难道我形成思维定式了??


    补充说明一下   不是一开始就报错   而是while循环循环到1008次后报错   很诡异
    2009年10月9日 14:00
  • *resultEarnings = (EARNINGS *)realloc(*resultEarnings, (tmp+1000)*sizeof(EARNINGS));
     memset(loopResultEarnings,0,1000*sizeof(EARNINGS));
    这里有部分空间未初始化
    怎么不用vector


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月9日 14:06
    版主
  • 前面的没有初始化那部分已经有原来的数据了阿  不能初始化  要不然原来的数据就会丢失
    2009年10月9日 14:11
  • realloc是重新分配空间,就是free+malloc,原有的数据本来就会丢失,所有指向free掉的内存的指针也会同时变为非法。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月9日 14:20
    版主
  • 不是吧  我看realloc的用法都说原来的数据不会丢失的阿 ?
    你确定realloc会把原来的数据丢失?
    2009年10月9日 14:21
  • 看错,realloc会复制数据
    realloc=0时要保存旧的指针,不然分配失败时数据会丢失。
    resultEarnings的类型是什么?EARNINGS**?


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月9日 14:54
    版主
  • 是的   EARNINGS **resultEarnings
    2009年10月9日 14:56
  • 你可以在realloc之后保存新的缓冲区的首地址和大小,在strncpy之前assert一下看看&loopResultEarnings->date是否在缓冲区里面
    如果不在的话检查程序其他地方是否有缓冲区溢出。


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月9日 15:02
    版主
  • *resultEarnings在realloc后不就是新的缓冲区的首地址嘛??
      我试一下assert看看
    2009年10月9日 15:07
  • 有这句
    if(NULL == loopResultEarnings->date){
        loopResultEarnings->date = (char *)malloc(NAME_LENGTH);
        if(NULL == loopResultEarnings->date){
             printf("getResultEarnings::malloc for loopResultEarnings->date error!\n");
             goto ErrorExit;
        }
    应该不会loopResultEarnings->date出错。否则会goto了。是不是loopStandardStock->date被越解修改了
    麻烦把正确答案设为解答。
    2009年10月10日 6:11
    版主