🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

1579閲覧

ポインタの配列に代入

mix_angel

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2019/08/27 13:13

char型のポインタを宣言し、scanf_sで代入しようとすると、コンパイルもデバックも正常にできるのに、文字を打ってエンターを押すとDebug Assertion Failed!と警告されてしまいます。ポインタの解釈がまちがっていますか?関数にしてはいけないのでしょうか?

...
char *gook[10];

void go(int i) {
scanf_s("%s",gook[i],4);
}

int main(void){
...
go(0);
...
go(1);

}

こんな感じです。C言語で、Microsoft visual studioを使っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ポインタの中身が空に見えます。省略されているのですか?

投稿2019/08/27 13:21

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どう見ても正しい時は、一旦目を変える(目が慣れちゃってる)必要があります。明日になれば、あーって思うと思います。

char *gook[10];

アスタリスクがいりません。
あと、今回不要なんですが、不要かどうかはともかく

char gook[10] = {0};

を習慣づけると、魔除けになります。

※コードを読み間違いしてました。
コメント欄も見てください。
goの入力値が配列の範囲内かどうかチェックすることも考えておいてください。

投稿2019/08/27 15:13

編集2019/08/27 16:19
kendji

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/08/27 16:01

"ポインタの配列に代入"と言っているので“アスタリスクがいりません。”はおかしいです?
kendji

2019/08/27 16:14

言われてみればそうですね。こういう処理は大抵ベクターを使うので見抜けませんでした。Cだとデータ領域に50バイトの連続配列を確保して頭から5バイトづつのトップアドレスをポインター配列に代入するとかですかね。ご指摘ありがとうございました????
cateye

2019/08/27 16:20

こういう場合はcharの2次元配列を用意して、そのアドレスを代入するとかですかね?・・・方法は色々有りますが・・・
kendji

2019/08/27 16:26

ありますよね、方法。 2次元配列ありましたね。使えますね。 char gook[10][5] = {0}; でうまくいきそうですね。 オーバーランもしない感じですし。
guest

0

よくある間違いです。文字列を格納する領域を確保しないで、ポインタを使っています。
「追記」
ポインタを扱うときには、データの格納域を確保してそのアドレスを代入することを忘れないようにしましょう。

c

1char str[]="abcdefg"; 2char *ptr= str;

こんな感じかな?

text

1usr ~/Project/test % ./a.out 2入力開始 3123 42 53 64 75 86 97 108 119 120 13入力終了 14123 152 163 174 185 196 207 218 229 230

scanf_s()が使えないのでscanf()にしてますが・・・入力時の文字数には気をつけましょう。

c

1#include <stdio.h> 2 3#define PTR_SIZ (10) 4#define STR_SIZ (5) 5 6static void go(char *sp) 7{ 8 scanf("%4s",sp); 9} 10 11int main(void) 12{ 13 char str[PTR_SIZ][STR_SIZ]; 14 char *gook[PTR_SIZ] = { str[0], str[1], str[2], str[3], str[4], 15 str[5], str[6], str[7], str[8], str[9] }; 16 // 17 puts("入力開始"); 18 for (int i = 0; i < PTR_SIZ; i++) { 19 go(gook[i]); 20 } 21 puts("入力終了"); 22 // 23 for (int i = 0; i < PTR_SIZ; i++) { 24 puts(gook[i]); 25 } 26 27 // 28 return 0; 29}

各関数についてはC言語関数辞典などを参考にして下さい。
当方の環境
clang version 10.0.0 (trunk 367677) on Linux mint 19.2

投稿2019/08/27 13:40

編集2019/08/27 23:07
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2019/09/03 22:12

メモリを確保しないで つまり存在しないはずのメモリを ポインタ変数?に格納しているから エラーになるということですか?
cateye

2019/09/03 22:19

グローバル(関数の外)でchar *gook[10];を確保しているから初期値はNULL(0)です。 そこにアクセスするのでエラーになります。ポインタには、有効な変数(intでも何でも)のアドレスを設定しましょう。 蛇足:関数内で確保したポインタの初期値は不定です。なので、何が起こっても仕方ないですよ。
kazuyakazuya

2019/09/03 22:40

char *gook[10]; に問題があるということですか? ポインタ変数に文字列(標準入力キーボード アドレスが確保されていない)を格納しようとしているからエラーになると思ったのですが...
cateye

2019/09/03 22:59 編集

scanf()に渡すのはポインタですがscanf()の方は与えられたポインタの指しているアドレス(この場合は0)が“読み込んだデータの格納先”という判断で動きます。そしてそこに読み込んだデータ(この場合は文字列)の格納先と思って、書き込みに行ってコケるのです。
kazuyakazuya

2019/09/03 22:57

ありがとうございます。理解不足でした
guest

0

ベストアンサー

char *gook[10];

グローバル変数であるなら、この宣言の時点で、10個のNULLのポインタが確保されます

scanf_s("%s",gook[i],4);

これで、文字列はどこに格納されるのでしょうか。
よく考えてみよう。

投稿2019/08/27 13:36

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mix_angel

2019/08/27 23:31

あ!本当ですね^_^ NULLポインタになってました。 *gookに初めから仮の値を代入しておいたらちゃんと入るようになりました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問