質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

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

Q&A

解決済

2回答

1198閲覧

ダブルポインタをchar (*)[20]型として関数に渡したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2020/12/19 23:57

関数に引数を渡す際に
note: expected 'char ()[20]' but argument is of type 'char **'
このような警告が出ます。
char (
)[20]型で渡すべきところを、ダブルポインタで渡してしまっているのが原因なのは分かるのですが
どう書けばダブルポインタを、char (*)[20]型として関数に渡せるでしょうか?

main.c: In function 'main': main.c:34:18: warning: passing argument 1 of 'str_to_array' from incompatible pointer type [-Wincompatible-pointer-types] 34 | str_to_array(args); | ^~~~ | | | char ** main.c:11:26: note: expected 'char (*)[20]' but argument is of type 'char **' 11 | void str_to_array(char (*array)[Y]) { | ~~~~~~~^~~~~~~~~

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define X 100 6#define Y 20 7 8// 受け取った文字列を空白区切りで配列に格納していく 9void str_to_array(char (*array)[Y]) { 10 char *str = (char*)malloc(sizeof(char) * 256); 11 char *token; 12 13 fgets(str, 256, stdin); 14 str[strlen(str)-1] = '\0'; 15 16 token = strtok(str, " "); 17 int idx = 0; 18 while (token != NULL) { 19 strcpy(array[idx], token); 20 idx++; 21 token = strcpy(NULL, " "); 22 } 23 free(str); 24} 25 26int main() { 27 //args[100][20] <- これを動的確保で作る 28 char **args = (char**)malloc(sizeof(char) * X); 29 for (int i = 0; i < X; i++) { 30 args[i] = (char*)malloc(sizeof(char) * Y); 31 } 32 //関数にchar(*)[20]型として渡したい 33 str_to_array(args); 34 //メモリの解放 35 for (int i = 0; i < X; i++) { 36 free(args[i]); 37 } 38 free(args); 39}

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

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

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

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

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

guest

回答2

0

ベストアンサー

char (*)[20]型で渡すべきところを、ダブルポインタで渡してしまっているのが原因なのは分かるのですが

どう書けばダブルポインタを、char (*)[20]型として関数に渡せるでしょうか?

メモリ・レイアウトが異なるので単にキャストしてもコケる。

char (*)[20] は連続したひとつのメモリ領域を20個ごとに切り分ける。
char** はメモリ領域がn個ある。

やるならこう↓なるかな。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define X 100 6#define Y 20 7 8// 受け取った文字列を空白区切りで配列に格納していく 9int str_to_array(char (*array)[Y]) { 10 char *str = (char*)malloc(sizeof(char) * 256); 11 char *token; 12 13 fgets(str, 256, stdin); 14 str[strlen(str)-1] = '\0'; 15 16 int idx = 0; 17 for ( token = strtok(str, " "); token != NULL; token = strtok(NULL," ") ) { 18 strcpy(array[idx], token); 19 } 20 free(str); 21 return idx; 22} 23 24int main() { 25 //args[100][20] <- これを動的確保で作る 26 char (*args)[20] = (char(*)[20])malloc(sizeof(char) * X * Y); 27 28 int n = str_to_array(args); 29 int i = 0; 30 while ( i < n ) { 31 printf("%d:[%s]\n", i, args[i]); 32 ++i; 33 } 34 //メモリの解放 35 free(args); 36}

投稿2020/12/20 01:40

episteme

総合スコア16612

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

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

episteme

2020/12/20 02:23

失礼な奴だな。 ベストアンサーを付け替えるのは構わんが、その理由と礼をきちんと述べるのがマナーではないのか?
kaina

2020/12/21 00:22

名前から察して欲しいってことじゃないかな。
episteme

2020/12/21 00:54

クソ野郎を名乗るとこからして"推して知るべし"か。
guest

0

たんにそうするだけなら、
str_to_array((char(*)[20])args);
とすればいいですが、
提示のコードではキャストするだけでは動きませんよ

投稿2020/12/20 00:10

y_waiwai

総合スコア88042

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

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

episteme

2020/12/20 02:57

なんでこれが低評価?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問