0

I thought when assigning a vaule to a pointer, you should use * operator, but I saw a code like

char *a;
void *b;
b = "Hello";
a = b;
printf("%s", a);

This is legal when I compiled it and prints Hello. Doesn't need a pointer to void dereferencing?

4

4 に答える 4

4

void *aと achar *は任意のタイプのポインターを保持できるため、これは「機能します」 。たとえば、int *a;代わりにを使用すると、問題が発生する可能性がありvoid *a;ます。

ただし、コードはvoidポインターを逆参照しておらず、printf 関数char *は、リスト内の可変引数から引数を引き出すときにポインターを に変換します。したがって、コード内に void ポインターの逆参照はありません。「追加情報」なしでバイトをアドレス指定しない一部のタイプのマシンで、ポインタが完全に に変換されなかった場合char *(たとえば、int *a;バイトを読み取るときに必要なその単語内のバイトを格納するために使用されます)、printf が正しく動作しない可能性があります [「未定義の動作」]。

于 2013-01-24T15:39:42.310 に答える
1

voidへのポインタは、間接参照する必要はありません。実際、voidポインタの逆参照は違法です。明らかに、任意のポインターをvoidポインターにキャストし、voidポインターを他の任意のポインター型にキャストすることができます。

それが理由です:

void *b = "hello world";うまくいったのでchar *a = b、それから印刷aしました。ここで何が起こるか:

char *a; // declares a as a pointer to char
void *b; // declares b as a void pointer(which can hold an address)
b = "Hello"; // 'b' now holds the address, that points to the start of "Hello"
a = b; // now, 'a' contains the address that 'b' does
printf("%s", a); // prints the string, starting from the address pointed by 'a'.

したがって、これは完全に合法です。

于 2013-01-24T15:37:44.410 に答える
1

char*C には文字列型はありません。配列の先頭へのポインタをchar文字列として扱うことができます。そして、それはまさにここでprintf扱う方法aです。

私が覚えている限りでは、C 標準はそれを要求しchar*void*交換可能です。

于 2013-01-24T15:32:12.800 に答える
0

b = "Hello"; この行は、大量の char メモリを割り当て、そのアドレスをvoidポインタ variableに割り当てますb

void ポインターは、他のデータ型のアドレスを格納できます。void ポインターの唯一の制限は次のとおりです。

  • 明らかな理由で void ポインターを逆参照できません
  • sizeof(void)違法です
  • void ポインターに対してポインター演算を実行することはできません

ただし、GCC はそれが 1 であると想定しsizeof(void)、void ポインターでのポインター演算を許可します。

a=b;aこれは、 void ポインターに含まれるアドレスに初期化された典型的な char ポインターbです。これは合法ですが、悪用すると影響が出る可能性があります。

printf("%s", a);これは単純な printf ステートメントです。

このコードのすべてが問題ありません。

*はい、ポインタで割り当てられたメモリに値を割り当てるために使用する必要があります:例:

   char *c=malloc(sizeof(char));
   *c='a';

また

   char a='a';
   char *c=&a;
   *c='b';

また、*ダブル ポインターを使用する場合、 を使用して別のポインターを初期化します。

   char *a=NULL;
   mymalloc(&a);


   void mymalloc(char **a)
   {
     *a=malloc(10);
     return;
   }

お役に立てれば。

于 2013-01-24T15:31:38.387 に答える