2017-02-27 8 views
0

私はプログラミングをしています:Bj​​arne StroustrupがC++を使って原則と実践をしています。私は27章で魚が遭遇しました。これは、コード行です:プログラミング原則と練習の章27不注意なリストの間違い?

struct List* lst = (List*)malloc(sizeof(struct List*)); 

は、私の質問は、このように記述するべきではありませんされています。私は最初のバージョンでプログラムをコンパイルするとき

struct List* lst = (List*)malloc(sizeof(struct List)); 

、それが正常に動作しますが、私は持っています見たmallocは2番目のバージョンとして使われています。

私の質問は正しいですが、違いは何ですか?

PS:本書はC++について書かれていますが、この章ではCで書く方法を提示しようとしています。実際これはCプログラムです。

+0

慣用的なC++が動作する限りどちらも正しいわけではありません。 mallocはコンストラクタを呼び出さないので、 – StoryTeller

+2

C++の発明者が(基本的に)CコードとCコードを書くことは間違いかもしれません。たぶん彼は、Cに関する悪い事例を示し、それをC++で書くべき方法と対照するためのプログラムを書いたのでしょうか?文章がなく、何かを意味するコードが2行しかないので、本を持っていないか、すぐに利用できないということはわかりにくいです。 –

+1

@Someprogrammerdudeはこの場合ではありません。最初のものは間違っていますか?私はあまりにも明白な何かをここで欠いていますか –

答えて

1

経験則:混乱しているときは、データタイプを確認してください。

lstは、を指すポインタの変数struct Listを指します。したがって、struct Listを保持するために必要なメモリの場所はsizeof(struct List)になります。だから、2番目のバージョンは理にかなっています。

はP.Sは:おめでとう、あなたはそれ以外のキャストは、構文エラーで、Listtypedefになるように定義され、

また、表示されます:)正しいと思いました。


注:

場合、このコードは、Cスニペット、please see this discussion on why or why not to cast the return value of malloc() and family in C.として解釈されるべきです。

+0

@SebTu申し訳ありませんが、C++の場合、IFFではmalloc()を使用していますが、キャストが必要です。 mallocはvoid *を返します。 Cでは、キャストは暗黙的ですが、 –

+1

ヤップ、混乱のために申し訳ありません。あなたは完全に正しいです。 – SebNag

関連する問題