*buf);これはエラーでした。何が違うんですか??attachmentクリップ1気になる質問をクリップするクリップした質問は、後からいつでもマイページで確認できます。クリップした質問に回答があった際、通知やメールを受け取ることができます。自分も答えを知りたい質問者以外のユーザにも役立つ評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。質問の評価を上げたことを取り消します低評価-評価を下げられる数の上限に達しました評価を下げることができません1日5回まで評価を下げられます1日に1ユーザに対して2回まで評価を下げられます質問の評価を下げるteratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。コメントをしてください。送信する質問の評価を下げる機能の利用条件この機能を利用するためには、以下の事項を行う必要があります。使用可能な領域のアドレスをポインタにセットしていないから。未初期化のポインタや、ヌルポインタという利用不可能な領域を指すアドレスをセットしたポインタは、使用可能な領域のアドレスをセットしておらず、正しく実行されない。リテラル文字列(二重引用符で囲んだ文字列)は、その内容が格納された読み取り専用領域のアドレスを指す。そのため環境によっては正しく実行されない。どちらにも問題がある。*bufへの代入は、bufが指す先のchar型への代入を意味する。"456"はchar型のポインタであり、char型ではなく、代入できない。'Z'はchar型であり、代入可能なのでコンパイルエラーは発生しない。1(後半)同様、bufは読み取り専用領域を指しているので、環境によっては正しく実行されない。配列strの「中身が」初期化されておらず、printf関数がどこまで読み込んでいいのか分からず(printf関数はヌル文字にあたるまで読み込み続ける)、利用不可能な領域にアクセスしてしまい、異常終了する。C言語には、配列をまるごと別の配列にコピーする命令は用意されていないからです。2;と無理矢理代入しているようなものになってしまうのです。'¥0';のように、1要素(文字)ずつコピーする必要があります。(strcpyという関数を使用すればこの面倒は解消されます。*buf);ではダメなようです・・・ということですが、まさにそれが答えです。printfの書式設定で、sは「引数のポインタの指す先のアドレス」にある文字列の表示を意味します。*bufはポインタではなく、char型の変数なので、printf関数が利用不可能な領域にアクセスしてしまい、異常終了します。buf);というように使い分ける必要があります。&ptr);最終行が問題です。ptr);とする必要があります。&i);というように、&を使う必要があるかを説明します。C言語では、関数の引数は元の変数や値の「コピー」というルールになってます。コピーの方をいくら操作しても、元の変数には何の影響もありません。*/というように書いたとしても、元の変数は操作できません。元の変数の「アドレス」を関数に渡して、そのアドレスの先を操作することで、変数を操作しているのです。文字列を読み込むときはどうでしょうか。ptrは元々ポインタ、すなわちアドレスですよね。ptrの指す先の領域を操作すれば、配列の中身を変更できます。ptrという「ポインタ変数」を操作する必要はありません。操作するのはその「中身」です。%sという文字列読み込みの書式設定の場合だけ例外で、&ptrではなくptrを渡すというルールになっているのです。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。16:57ありがとうございます。ありがとうございます。16:59行き違いで加筆しました。追記分はこれからさらに加筆します。行き違いで加筆しました。追記分はこれからさらに加筆します。17:08とても、わかりやすいです。17:173番ですね。&p);ポインタのアドレスをscanfに指定するとどうなるかが、まだよくわかりません3番ですね。17:392番については、再度質問します。2番については、再度質問します。17:40ありがとうございましたありがとうございましたキャンセル完了するlink+1ポインタは:宣言されただけでは有効なメモリ番地を指し示しているとは限りません。配列:宣言するだけで有効なメモリ領域を確保し、配列名と先頭番地を指し示すポインタを兼ねます。→ただし、これは固定のポインタ変数であり、他のアドレスを代入し直すことができません。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。16:58ありがとうございますありがとうございますキャンセル完了するlink+1こんにちは。最初の方だけ、ちろっと回答してみます。buf;と書くと分かりやすいです。char*変数を1つ定義してます。見ての通り初期化してませんので、不定値のままです。bufはchar型へのポインタですから、どこか分からない謎の場所を指してます。buf);は、その「謎の場所」へ文字列を読み込みますので、普通は落ちます。linuxで落ちなかったのはたまたまかも知れません。happy"という文字列が記録された先頭メモリを指してます。happy"は定数ですから、最近のPCでは書き換え不可と指定されたメモリ上に記録されます。(この辺はMMUの機能です。x86系CPUはそのような機能をもつMMUを内蔵してます。)書き換え不可ですから、そこにscanf()で読み込もうとすると、書き換え不可例外が発生し落ちます。それをchar*へ代入しようとした時点でコンパイラによっては警告、もしくは、エラーになると思います。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。16:58ありがとうございます。いままで、初期化されていないポインタを使っていたので、やめますね。ありがとうございます。いままで、初期化されていないポインタを使っていたので、やめますね。住所録のプログラムのあちこち分からないところがあります。0ポインタを使って文字列挿入したい。0プログラムの内容がうまく呑み込めないので、説明をお願いできますか。0オーバーフローを防ぎたいんですが、fgets()だと表示が崩れる。文字列とポインタについてです。頂いたご意見への回答は行っておりません。