2011-02-02 23 views
0
typedef struct fred { 
    char mytype[41]; 
    char* myremark; 
} fred_t; 

のcharポインタへのアクセスその構造体のインスタンスで構成

fred_t* mystruct; 

私はMYTYPE

fprintf (stdout, "%s\n", mystruct->mytype); 

を印刷することができますが、私は同様の方法でmyremarkを印刷する構文を取得するために失敗しています。

(それは私が修正してる古いコードです。)

答えて

1

インスタンスが正しく初期化されている場合(つまり、myremarkが有効な文字列を指している場合)、これは全く同じ方法で印刷できます。 stdoutに文字列を印刷するところで

、あなたは、単にputsを使用することができます。

puts(mystruct->mytype); 
puts(mystruct->myremark); 
+0

してください理由を説明します。 mystruct-> mytypeは[* mystruct] .mytypeです。これはcharです。 myystruct-> myremarkはchar *へのポインタである[* mystruct] .myremarkです。 – Mike

+0

'mytype'は' char'(1文字になります)ではなく、charの*配列*です。 'puts'や' fprintf'のような関数は 'char *'に崩壊します。 Cでは 'char'ポインタ/配列は文字列であることに注意してください。2つのメンバーの基本的な違いは、 'mytype'のためのメモリ内のスペースは構造体自体にあり、' myremark 'が指す文字列のスペースは他の場所(恐らくヒープ内)にあります。 –

+0

これらの両方を扱うと、mytypeで成功するが、myremarkでシグナル11が返されます。 null終端文字がないことを意味しますか? – Mike

1

myremark単なるポインタです。それは何も指していないし、見た目からは初期化されていないので、ランダムなメモリブロックを取得するだけです。

mytypeは、記憶領域(正確には41バイト)を割り当てているので、望ましい結果が得られます。 myremarkは何も指しません。

+0

私はより複雑なものから構造を単純化しました。それはAPIへの他の呼び出しによって設定されます。そこに私はそれをprinできないsometingがあります。 – Mike

+0

@Mike、コードを貼り付けることはできますか?ポインタが何かを指し示していない場合、あなたの元の質問が推測している通りではない場合、間違っていると分かりにくいところまで簡略化しました:) –

+0

Thanks - Moo-Juice – Mike

0
fprintf (stdout, "%s\n", mystruct->myremark); 
0

fprintf (stdout, "%s\n", mystruct->myremark);myremarkが正常に終了NULLの場合に動作するはずです。

0

%s修飾子は、配列の場合と同じように使用します。あなたが有効な文字列を指すようにmyremarkを初期化したことがありますか?

0

私が接続しているAPIは、文書化されています。各呼び出しは簡単に文書化されていますが、どのように電子メールが掛かっているかについてはほとんど指針がありません。サンプルコードの小さなコレクションがあります。最終的に私は、無関係なサンプルコードの似たような例を「ベクトル」(検索しないでください)を検索することによって見つけました。最初の段階で構造のインスタンスを識別する2つのステージのプロセスがありましたが、char *ポインタが指すメモリは、既に識別された構造を参照する2番目のAPI呼び出しの後にデータが移入されませんでした。私が提示した簡略化された図よりはるかに大きい)。私はこの第二の呼び出しを逃していた。

ほとんどすべての人が、ポインタが実際の文字列を指しているかどうかを尋ねました。彼らは大丈夫だったし、私の構文をどのように変更しても、2回目の呼び出しまでは何も見つからなかった。回答したすべての人に感謝