0

ここにプログラミングスニペットがあります

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 を指していることです。私の理解では、データはヒープに割り当てられているため、関数内で指していたアドレスを指し続ける必要があります。

ここで何が欠けていますか?

4

3 に答える 3

0

実際、データをポインターとして関数に渡す場合、ポインター自体ではなく、ポインターの下の値のみを変更できます。

これを行うには、次のように double ポインターを使用する必要があります。

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;
}
于 2013-10-28T23:32:03.040 に答える