0

以下のような構造にメモリを割り当てたい

typedef struct {
int *buffer;
int length;
int dsn;
int handle;
} myStr;

どちらが正しいですか?

myStr *pStr = malloc(sizeof(myStr)+lenOfBuff);

また

myStr *pStr = malloc(sizeof(myStr));

最初のものを使用するいくつかの例を見ましたが、それは私には少し奇妙に思えます。同時にデータバッファにメモリを割り当てる必要がありますか?

4

4 に答える 4

4

場合によります。

作成後にバッファの長さを変更したい場合は、別途割り当てる必要があります。そうでない場合は、1 回の呼び出しで 2 つのブロックを同時に割り当てることができますmalloc()。これは、わずかに効率的である可能性があります。

共同割り当ては次のようになります。

myStr * mystr_create(size_t initial_size)
{
  myStr *ptr;

  ptr = malloc(sizeof *ptr + initial_size * sizeof *myStr->buffer);
  ptr->buffer = (int *) (ptr + 1);
  ptr->length = initial_size;
  ptr->dsn = ... something ...
  ptr->handle = ... something ... *

  return ptr;
}
于 2012-09-05T12:22:31.473 に答える
3

データごとに個別にメモリを割り当てる必要があります。

#include <stdlib.h>

myStr *pStr = malloc(/* ... */);
pStr->buffer = malloc(/* ... */);

Cには例外があります:柔軟な配列メンバー

于 2012-09-05T12:13:33.063 に答える
2

2番目は正しいです。最初は正しくありません。バッファ内のデータは個別の割り当てになります。

最後のフィールドに配列が表示されることがあります。これは、構造体に単一の割り当てを使用することを意味します。これにより、mallocに渡されるサイズは、配列内の要素の数に応じて変化します。これは、多くの場合、表示されません。 C++サークル。その場合、1つの割り当てで解決できます次の形式は、C ++では未定義ですが、一部の実装で使用およびサポートされていることがわかります。

struct t_array {
  size_t count;
  t_thing at[1]; // << variable length array, with t_array.count elements
};

Cでは、柔軟な配列を使用できますが、C++コンパイラは拡張機能によってのみその機能をサポートします。

于 2012-09-05T12:14:35.503 に答える
0
typedef struct {
  int length;
  int dsn;
  int handle;
  int buffer[];
} myStr;

最初のケースを使用したい場合。ただし、これが機能する理由を理解できるほど十分に理解していない場合は、これを行わないことを強くお勧めします。

于 2012-09-05T12:15:26.883 に答える