2

外部ヘッダーファイルで定義されたタイプMapの構造体へのポインターがあります。

typedef struct {
    char *squares; //!< A pointer to a block of memory to hold the map.
    int   width;   //!< The width of the map pointed to by squares.
    int   height;  //!< The height of the map pointed to by squares.
} Map;

ポインタは次のように初期化されます。

    struct Map *map_ptr;    
    map_ptr = create_map(*w_ptr, *h_ptr);
    // create_map returns Map*, w_ptr and h_ptr are pointers to height and width fields for a map/maze.

create_mapで作成されたMap構造内に格納されているwidthとheightの値を印刷するにはどうすればよいですか?create_mapは外部ファイルに保持され、mainに返される唯一の変数はマップへのポインターです。

以下は、コンパイル時にエラーを出します(「エラー:不完全な型へのポインターの逆参照」)

printf("Height = %d\n", map_ptr->height);

私の知る限り、以下のコードはメモリアドレスを出力するため、ポインタは有効です。

printf("Pointer address for map = %p\n", map_ptr);
4

4 に答える 4

4

struct次の場所からキーワードを削除するだけです。

struct Map *map_ptr;    

に:

Map *map_ptr;    

名前のない構造体を宣言し、それをにtypedefしましたMap。したがって、宣言するstruct Map *map_ptr;と、コンパイラはこれがと呼ばれる別の構造体Mapであると見なします。

于 2012-12-30T22:30:09.603 に答える
2

Cで名前空間と呼ばれるものにつまずいた。

  • で紹介したtypedef名typedef struct { ... } Map;
  • で紹介したように、構造体タグstruct Map *map_ptr;
  • さらに、オブジェクトのその他の名前空間、マクロ名、..。

同じ識別子を異なる名前空間で再利用できます。構造体のtypedefを気にしないことをお勧めします。それは有用な情報を隠すだけであり、それはあなたが時々書くことからあなたを救うすべてをしますstruct。何かが構造体または構造体へのポインタである場合、それを知りたいので、メンバーを使用する->.、メンバーにアクセスするかを知ります。typedefを使用すると、有用な情報を非表示にすることでこれを無効にします。

問題を解決する1つの方法は、typedefを取り除き、structタグのみを使用することです。

struct Map {
    char *squares; //!< A pointer to a block of memory to hold the map.
    int   width;   //!< The width of the map pointed to by squares.
    int   height;  //!< The height of the map pointed to by squares.
};
struct Map *map_ptr = ...;
于 2012-12-30T22:59:33.827 に答える
0

いくつかのポイントを明確にするのに役立つ可能性のある完全な例を次に示します。

#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct {
    char *squares; //!< A pointer to a block of memory to hold the map.
    int   width;   //!< The width of the map pointed to by squares.
    int   height;  //!< The height of the map pointed to by squares.
} Map;


Map *
create_map ()
{
  printf ("Allocating %d bytes for map_ptr, and %d bytes for map data...\n",
    sizeof (Map), 100);
  Map *tmp = (Map *)malloc(sizeof (Map));
  tmp->squares = (char *)malloc (100);
  strcpy (tmp->squares, "Map data...");
  tmp->width = 50;
  tmp->height = 100;
  return tmp;
}

int 
main(int argc, char *argv[])
{
  Map *map_ptr = create_map();
  printf ("map_ptr->height= %d, width=%d, squares=%s\n",
    map_ptr->height, map_ptr->width, map_ptr->squares);
  free (map_ptr->squares);
  free (map_ptr);
  return 0;
} 

出力例:

Allocating 12 bytes for map_ptr, and 100 bytes for map data...
map_ptr->height= 100, width=50, squares=Map data...

別のアプローチは、typedefの代わりに「structMap{...}」を使用することです。

例:

struct Map {
    char *squares; //!< A pointer to a block of memory to hold the map.
    int   width;   //!< The width of the map pointed to by squares.
    int   height;  //!< The height of the map pointed to by squares.
} Map;


struct Map *
create_map ()
{
...
  struct Map *tmp = (struct Map *)malloc(sizeof (struct Map));
  ...
}
  ...
  struct Map *map_ptr = create_map();
  printf ("map_ptr->height= %d, width=%d, squares=%s\n",
    map_ptr->height, map_ptr->width, map_ptr->squares);
  free (map_ptr->squares);
  free (map_ptr);
于 2012-12-30T22:29:23.387 に答える
0

回答1:</ p>

struct Map *map_ptr; 

Map *map_ptr; 

回答2:</ p>

typedef struct {
    char *squares; //!< A pointer to a block of memory to hold the map.
    int   width;   //!< The width of the map pointed to by squares.
    int   height;  //!< The height of the map pointed to by squares.
} Map;

struct Map{
    char *squares; //!< A pointer to a block of memory to hold the map.
    int   width;   //!< The width of the map pointed to by squares.
    int   height;  //!< The height of the map pointed to by squares.
} ;

理由:</ p>

if typedef struct{...}  B; 

それで

B == struct B{...}
于 2012-12-31T03:18:43.430 に答える