Cでは、malloc
が返すvoidポインターをキャストできます。 Cはこれを行いますが、明示的にすることもできます。
malloc
は、void *
またはvoidポインタを返します。この戻り値は、プログラマによって他のポインタ型にキャストできます。あるいは、プログラマはCを使って型変換を行うことができます。キャストを使用したCの型変換は変更されません。
ただし、Cコンパイラに依存するCコードは妨げになり、読みにくい場合があります。 開発プログラマーは、最終的にコードを読む必要があるメンテナンスプログラマーを助けることができます。
返された値malloc
に明示的なキャストを追加すると、 を持つ人間は、コードを読み、作成者の意図を判断するのに役立ちます。これは、malloc
によって返されたvoidポインタを明示的にキャストすることの本当の利点です。このプログラミングプラクティスは、コンパイラを間違って指示したり、変更されるかもしれないいくつかの難解なコンパイラ機能を使用したりしません。
次の3つの例は、このプログラミングの実践を強調しています。最初の例では、 malloc
(これは<stdlib.h>
で定義されています)が明示的にキャストされ、いくつかの簡単な作業が です。
#include <stdlib.h>
#define nr_chars 4
main()
{
char *data;
data = (char *) malloc(nr_chars*sizeof(char));
*data++ = 'a';
*data++ = 'b';
*data++ = 'c';
*data++ = '\0'; // it is allowed to go one past an array
data -= nr_chars; // back to the front of data
printf("%s\n", data);
// prints abc at the console
}
この2番目の例では、唯一の違いは<stdlib.h>
がコメントアウトされていることです。 コードが実行され、同じ結果が生成されます。さて、なぜこの作品が「なぜ」の理由はかなり直接的です。 Cが関数のプロトタイプを見つけられない場合、関数はint
を返しますが、malloc
はvoidポインタを返します。この場合、明示的キャストは、ソースの炭素単位と同様にCコンパイラに、malloc
によって返された値を文字ポインタに変換する必要があることを伝えました。
//#include <stdlib.h>
#define nr_chars 4
main()
{
char *data;
data = (char *) malloc(nr_chars*sizeof(char));
*data++ = 'a';
*data++ = 'b';
*data++ = 'c';
*data++ = '\0'; // it is allowed to go one past an array
data -= nr_chars; // back to the front of data
printf("%s\n", data);
// prints abc at the console
}
最終(うん)の例では、キャストを発行しないと<stdlib.h>
が含まれていません。 Eclipseエディタとコンパイラの両方でこのコードについて不平を言います。コンパイラメッセージは
..\main.c(18) : warning C4047: '=' : 'char *' differs in levels of indirection from 'int'
され、ソースコードは、次のとおり
//#include <stdlib.h>
#define nr_chars 4
main()
{
char *data;
data = malloc(nr_chars*sizeof(char));
*data++ = 'a';
*data++ = 'b';
*data++ = 'c';
*data++ = '\0'; // it is allowed to go one past an array
data -= nr_chars; // back to the front of data
printf("%s\n", data);
// compiler displays a "warning" and prints abc at the console
}
変更例3は、警告なしで結果を含むことを目的とするように、プログラムが実行されます。しかし、例2と3の両方とも明示的なキャストがなく、この形式で書かれたコードの生涯にわたり、このようなコードは、より高価であり、人間によって間違って変更される可能性が高い(したがって、追加の費用) Cコンパイラ。
[無効\ 'から'ノード\ * '\ [-fpermissive \]]への無効な複製(http://stackoverflow.com/questions/16793587/invalid-conversion-from-void-to -node-fpermissive) –
エラーメッセージが 'voidを使用してkiss_fft_ctxを初期化することはできませんでした。私はそれが 'void *'と 'kss_fft_ctx *'だと思います。これらのアスタリスクは、言語の意味と理解に大きな違いをもたらします。 – abelenky