【问题标题】:Why does the pointer address return to 0 despite allocation on heap?为什么尽管在堆上分配,指针地址仍返回 ​​0?
【发布时间】:2013-11-07 22:35:30
【问题描述】:

这里是编程sn-p

void func1 (UInt8* data, size_t length)
{

       UInt8 *data2;

        //do some actions to populate data2 with valid data;

       length = 12;
       data = malloc(length);
       memset(data, 0 , length);
       memcpy(&data[0], &data2[9] , length);

      return;
}


void main()
{
     void *data;
     size_t dataSize;

     func1 (data, dataSize)

     printf ("%s", data);
}

这里的问题是,当我在调试器中看到从 func1 返回后的数据地址时,它指向 0x0000。我的理解是,由于数据是在堆上分配的,它应该继续指向它在函数中指向的任何地址。

我在这里错过了什么?

【问题讨论】:

  • C 是Call By Value。这基本上意味着分配给参数不会导致重新分配给调用者中的变量。 (指针允许间接修改对象而无需重新分配。)
  • 谢谢。我错过了我试图在这里修改指针本身的观点。

标签: c pointers malloc heap-memory


【解决方案1】:

更正:

void func1 (UInt8** data, size_t length)
{

       UInt8 *data2;

        //do some actions to populate data2 with valid data;

       length = 12;
       *data = malloc(length);
       memset(*data, 0 , length);
       memcpy(data[0], &data2[9] , length);

      return;
}

当你调用一个函数时,它的参数会被复制。修改出函数的指针,不使用函数返回值,就得用指针来修改你的指针。

【讨论】:

    【解决方案2】:

    数据仍然存在于堆中,但是您传递给func1 的指针在调用站点不会更改,因此您正在“泄漏”内存。

    您需要将指针传递给指针,以便能够处理:

    func1(&data, &dataSize);
    
    void func1 (UInt8** data, size_t *length)
    {
    
       UInt8 *data2;
    
        //do some actions to populate data2 with valid data;
    
       length = 12;
       *data = malloc(*length);
       memset(*data, 0 , *length);
       memcpy(*data, &data2[0] , *length);
    
       return;
    }
    

    【讨论】:

    • Copsey你能详细说明一下吗?
    【解决方案3】:

    其实,当你把数据作为指针传递给函数时,你只能修改指针下的值,不能修改指针本身。

    为此,您必须使用双指针,如下所示:

    void fillData(UInt8** data, size_t length)
    {
        UInt8 *data2;
        // fill data2
    
        *data = malloc(length);
        memset(*data, 0 , length);
        memcpy(data[0], &data2[9], length);
    }    
    
    int main()
    {
        void *data;
        unsigned int dataSize = 42;
        fillData(&data, dataSize):
    
        printf("%s", data);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多