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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

3回答

649閲覧

C言語:自作関数に関して

SUNMOON_14

総合スコア20

C

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/07/18 14:29

編集2021/07/18 14:34

質問

char *args[256]があったとして、これを関数に渡し、これを返すような関数の宣言の仕方として次は正しいでしょうか?

C

1// プロトタイプ宣言 2char **fuction(char*[]) 3 4int main(){ 5 char *args[256]; 6 7 args = function(args); 8} 9 10char **funtion(char *args[]){ 11 int i; 12 for(i = 0; ; ++i){ 13 if(strstr(args[i], "*") != NULL) break; 14 if(args[i] == NULL) return args; 15 } 16 17 ( 省略 ) 18 return args; 19}

現状

printfでargs[i]を出力しようとしたり、実行してみたりしましたが、セグメンテーション違反になります。
原因はここではないかもしれませんが。

argsの構造

argsは例えば次のような構造をとっています:
args[0] = ls
args[1] = *
args[2] = NULL

いずれにせよ、この関数の書き方が正しいかどうか、また、間違っている場合にはどのようにすればよいかご教授ください。

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

「関数の書き方」という点ではまぁそれでもいいかと思います(返り値argsにどういう意味があるかは疑問)。
しかし、変数の内容が関数の(というか処理の)前提を満たさないものになっています。

関数に関係なく、

C

1int main(){ 2 char *args[256]; 3 //関数を展開 4 for(int i = 0; ; ++i){ 5 if(strstr(args[i], "*") != NULL) break; 6 if(args[i] == NULL) break ; 7 } 8 return 0; 9}

としても、かなりの確率でメモリアクセスエラーが出るのではないでしょうか。
なぜそうなるのか、考えてみてください。(すでに他の回答でネタは提供されていますが)

teratailの「質問するときのヒント」にこんな一節があります。

最も良いのは、現象を再現するためのミニマムなプログラムを改めて作ることです。そうすれば、貴方自身が現象と問題をより良く理解することにもつながるからです。

投稿2021/07/18 23:13

thkana

総合スコア7703

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

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

0

ベストアンサー

何の問題もなさそうですが...

C

1#include <stdio.h> 2#include <string.h> 3 4// プロトタイプ宣言 5char **function(char*[]); 6 7int main(){ 8 char *args[256]; 9 args[0] = "Hello"; 10 args[1] = "world"; 11 args[2] = "!"; 12 args[3] = "*"; 13 args[4] = NULL; 14 char** p = args; 15 p = function(p); 16 p = function(p); 17 p = function(p); 18 return 0; 19} 20 21char **function(char *args[]){ 22 int i; 23 for(i = 0; ; ++i){ 24 if(strstr(args[i], "*") != NULL) break; 25 if(args[i] == NULL) return args; 26 printf("[%s] ", args[i]); 27 } 28 printf("\n"); 29 return args; 30}

投稿2021/07/18 14:51

episteme

総合スコア16612

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

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

0

char *args[256];

と定義していますが、ローカル変数はその中身にはでたらめな値が入っています

まあ、でたらめな値、ってのはわかりづらいので、全て0が入るとしましょう。
そうした場合、あなたのそのコードではどういう事が起こるのか理解できるでしょうか

投稿2021/07/18 14:57

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問