二次元配列による文字列の配列の受渡しについての質問です。
#include <stdio.h>
void print_pname(char str[][5], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
printf("str[%d] = \"", i);
for (j = 0; str[i][j] != '\0'; j++)
putchar(str[i][j]);
printf("\"\n");
}
}
int main(void)
{
char ary[][5] = {"Lisp", "C", "Ada"};
print_pname(ary, sizeof(ary) / sizeof(ary[0]));
return 0;
}
上のプログラム中の関数print_pnameの引数char str[][5]についてですが
char (*str)[5](配列のポインタ)と変更した場合にwarningが多数発生します。
これはどうしてでしょうか?
また、上のプログラムを配列のポインタを使って変更することは可能でしょうか?
以上、よろしくお願いします。
No.7ベストアンサー
- 回答日時:
いや, 確かにそこはおかしいけど (注: どっちにしても未定義動作ですがそこはスルーしてた), while の条件が変です>#6. このまままわると *ary[3] を参照しちゃいます.
で本題に戻ると,
char (*ary)[5] = {"Lisp", "C", "Ada"};
は ary を「『大きさ 5 の配列』へのポインタ」として定義しています. ポインタはスカラーですから, このように複数の値を使って初期化することはできません.
なお, GCC (や ISO C に従っている処理系) なら
char (*ary)[5] = (char [][5]){"Lisp", "C", "Ada"};
で初期化できるかもしれません. でも, そのあとがどうせダメか.
Tacosanさん、回答有難うございます。
なんとなくですが理解できました。
まだまだ修行が足りないということです。
どうもすみませんでした。
No.5
- 回答日時:
while がおかしいですよ~>#4.
No.4
- 回答日時:
当方、Mac OSX の gcc コンパイラです。
正常にwarningを発することなく動いています。#include <stdio.h>
void print_pname(char (*str)[5], int n) {
int i, j;
for (i = 0; i < n; i++) {
printf("str[%d] = \"", i);
for (j = 0; str[i][j] != '\0'; j++)
putchar(str[i][j]);
printf("\"\n");
}
}
int main(void) {
char ary[][5] = {"Lisp", "C", "Ada"};
print_pname(ary, sizeof(ary) / sizeof(ary[0]));
return 0;
}
そんなことより、たかが文字列配列内容を表示するのに
str[1]= "Lisp"
str[2]= "C"
str[3]= "Ada"
なぜ静的配列あるいはグローバル配列として簡単に表示する方法を採用されないのですか?
#include <stdio.h>
int main(void) {
static char ary[][5] = {"Lisp", "C", "Ada"};
int i = 0;
while (*ary[i])
printf("str[%d]= \"%s\"\n", i, ary[i++]);
return 0;
}
No.2
- 回答日時:
その警告だと, List5_2x.c って名前のソースの 30行目が怪しいっていってるね.
30行目って, どこ?
この回答への補足
返事が大変遅くなり申し訳ありませんでした。
List5_2x.c のソースコード30行目は
char ary[][5] = {"Lisp", "C", "Ada"};
になります。
他の方が指摘されているように、このコードだと
warningなくコンパイル出来ていました。
私の質問内容が不適当でした。
<元のコード>
#include <stdio.h>
void print_pname(char str[][5], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
printf("str[%d] = \"", i);
for (j = 0; str[i][j] != '\0'; j++)
putchar(str[i][j]);
printf("\"\n");
}
}
int main(void)
{
char ary[][5] = {"Lisp", "C", "Ada"};
print_pname(ary, sizeof(ary) / sizeof(ary[0]));
return 0;
}
<変更後のコード>
#include <stdio.h>
void print_pname(char (*str)[5], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
printf("str[%d] = \"", i);
for (j = 0; str[i][j] != '\0'; j++)
putchar(str[i][j]);
printf("\"\n");
}
}
int main(void)
{
char (*ary)[5] = {"Lisp", "C", "Ada"};
print_pname(ary, sizeof(ary) / sizeof(ary[0]));
return 0;
}
元のコードから変更後のコードに変更するとwarningが発生するということでした。
みなさん、申し訳ありませんでした。
No.1
- 回答日時:
どのようなコンパイラで, どのような警告が出るんでしょうか?
この回答への補足
回答有難うございます。
コンパイラはgccです。
warningの内容は以下の通りです。
List5_2x.c: In function `main':
List5_2x.c:30: warning: initialization from incompatible pointer type
List5_2x.c:30: warning: excess elements in scalar initializer
List5_2x.c:30: warning: (near initialization for `ary')
List5_2x.c:30: warning: excess elements in scalar initializer
List5_2x.c:30: warning: (near initialization for `ary')
以上です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
C#で構造体の配列を持った構造...
-
define で 配列
-
配列の要素数に変数を入れたい...
-
Cのエラー
-
C言語において、 配列要素をひ...
-
エラー:浮動小数点の不正な使用
-
構造体のextern方法
-
c言語 構造体
-
配列の不正アクセスについて
-
C言語 ファイルの指定された行...
-
C#で配列が空かを判定するには?
-
C言語についてです 5人のテスト...
-
万年カレンダーについて。
-
C言語から質問です。
-
C++DLLからC#へのコールバック...
-
二次元配列による文字列の配列...
-
配列のアドレス部
-
C言語 ビットフィールドについて
-
bsearch関数の内容について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
配列の要素数に変数を入れたい...
-
構造体のextern方法
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語の2次元配列 容量が大き...
-
c言語 構造体
-
C言語 ファイルの指定された行...
-
C言語についてです 5人のテスト...
-
int i, int i[1];
-
fclose()でセグメンテーション違反
-
char型配列をint型に代入するには
-
C言語から質問です。
-
Cのエラー
-
コンボボックスでデフォルト値...
-
C言語の課題が出たのですが自力...
-
MFCのCArrayを使った二次元配列
-
[C++]const int と配列
おすすめ情報