1

Learn C the Hard Way という本に従っていますが、このプログラムを実行しようとすると、次のエラー メッセージが表示されます。

「void*」から非「void」へのポインターへの変換には、明示的なキャストが必要です。

これを解決する方法がわかりません。構造体の戻り変数を変更する必要がありますか?

とにかく見てみましょう。コードは次のとおりです: (Visual C++ 2010 でコンパイル、GCC はまだ試していません)。

   //learn c the hardway

  #include <assert.h>
  #include <stdlib.h>
  #include <string.h> 
  #include <stdio.h>

  struct Person {
      char *name;
      int age;
      int height;
      int weight; 
  };

  struct Person *Person_create(char *name, int age, int height, int weight) 
  {
      struct Person *who = malloc(sizeof(struct Person)); 
      assert(who != NULL);

      who->name = strdup(name);
      who->age = age; 
      who->height = height;
      who->weight = weight;

      return who;
  } 

  void Person_destroy(struct Person *who)
  {
      assert(who != NULL);

      free(who->name);
      free(who);
  }

  void Person_print(struct Person *who) 
  {
      printf("Name: %s\n", who->name);
      printf("\tAge: %d\n", who->age); 
      printf("\tHeight: %d\n", who->height);
      printf("\tWeight: %d\n", who->weight); 
  }

  int main(int argc, char *argv[])
  {
      // make two people structures 
      struct Person *joe = Person_create(
              "Joe Alex", 32, 64, 140);

      struct Person *frank = Person_create(
              "Frank Blank", 20, 72, 180); 

      // print them out and where they are in memory 
      printf("Joe is at memory location %p:\n", joe);
      Person_print(joe);

      printf("Frank is at memory location %p:\n", frank);
      Person_print(frank); 

      // make everyone age 20 years and print them again 
      joe->age += 20;
      joe->height -= 2;
      joe->weight += 40; 
      Person_print(joe);

      frank->age += 20;
      frank->weight += 20; 
      Person_print(frank);

      // destroy them both so we clean up 
      Person_destroy(joe);
      Person_destroy(frank);

      return 0;
  }
4

4 に答える 4

10

この行にはキャストが必要です:

  struct Person *who = malloc(sizeof(struct Person)); 

次のようにする必要があります。

  struct Person *who = (struct Person *)malloc(sizeof(struct Person)); 

これは、このコードを C ではなく C++ としてコンパイルしているためです。C では、キャストは不要であり、暗黙的に行われます。

于 2012-07-13T17:47:25.377 に答える
4

Visual C++ コンパイラは、コンパイルされているソース ファイルのファイル拡張子から、コンパイルされている言語を判別しようとします。たとえば、拡張子が .cpp のファイルは C++ としてコンパイルされ、拡張子が .c のファイルは C としてコンパイルされます。

あなたのプログラムは有効な C のように見えますが、有効な C++ ではありません。C では、void*toT*変換は暗黙的です。C++ ではキャストが必要です。

コンパイラで C としてコンパイルする場合は、ファイル拡張子を変更するか/TCスイッチをコンパイラに渡して、ファイルを C としてコンパイルするように指示する必要があります。

于 2012-07-13T17:48:48.413 に答える
3
struct Person *who = malloc(sizeof(struct Person)); 

これは C++ でキャストする必要があります。

struct Person *who = (struct Person *) malloc(sizeof(struct Person)); 

void *C では、任意のオブジェクト ポインター型への暗黙的な変換があるため、キャストは必要ありません。この暗黙的な変換は C++ には存在しないため、C++ ではキャストが必要です。

于 2012-07-13T17:47:37.353 に答える
0

このエラー メッセージは、C++ ではこのような変換が明示的に必要とされないのに対し、C ではそのような変換が必要であるという事実によって発生します。コンパイラがソースを C++ ではなく C として扱うようにしてください。

于 2012-07-13T17:50:36.243 に答える