2

私は次のことを行います:

void * myFunction(void) {
    void *someBytes = malloc(1000);
    // fill someBytes

    //check the first three bytes (header)
    if(memcmp(someBytes, "OK+", 3) == 0) {
        // move the pointer (jump over the first three bytes)
        someBytes+=3
    }

    return someBytes;
}

受信者はどのようにして malloced ポインターを解放できますか? もちろん、ポインターで -3 を実行することもできます。

しかし、その場合のベストプラクティスはありますか? レシーバー関数で呼び出しを許可するための簡単な解決策はありますか?複数のメガバイトを保持することもできたfree(someBytes); のでsomeBytes、memcpy を避けたいです (malloc(1000)これは例のためだけです)。

4

3 に答える 3

1

方法はありません (正確なオフセットを知っている場合を除きます)。ベスト プラクティスは、元のポインターのコピーを保存して、後でそれを使用してメモリを解放できるようにすることです。

void* myFunction(void) {
    void* someBytes = malloc(1000);
    void* pos = someBytes;
    // fill someBytes

    //check the first three bytes (header)
    if(memcmp(pos, "OK+", 3) == 0) {
        // move the pointer (jump over the first three bytes)
        pos+=3
    }

    return someBytes;
}
于 2012-07-21T14:22:13.617 に答える
1

構造体を定義して、関数に割り当てて、それへのポインターを返させてみませんか?

struct MyStruct {
  PrivateHeader *header;
  UserData* data;
};

PrivateHeaderアクセス/操作方法のみをmyFunction知っているデータへの不透明なポインターです。関数の消費者は、にアクセス/操作する方法しか知りませんdata

于 2012-07-21T14:40:21.460 に答える
0

受信者もバッファを作成できますか? myFunction が削除しないメモリを割り当てているのはなぜですか?

void* myFunction(void) {
  void* someBytes = malloc(1000);

  return someBytes;
}

は (機能的に) 次のものと多少同等です。

size_t myFunction(void* someBytes, size_t size) {
  // do something

  if(memcmp(someBytes, "OK+", 3) != 0) {
      return 0;  // didn't find nuthin'
  }

  return how_many_bytes_myFunction_put_in_the_buffer;
}


void myCaller(void)
{
  void* someBytes = malloc(1000);

  size_t result = myFunction(someBytes, 1000);

  // do something amazing

  free(someBytes);
}
于 2012-07-21T15:43:16.787 に答える