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

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

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

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

解決済

3回答

2726閲覧

C言語 コマンドライン引数の直後に格納されている文字列について

Kchan_01

総合スコア110

C

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

2クリップ

投稿2020/06/23 02:41

編集2020/06/23 03:01

C言語を独学している初心者です。何か目的があってというより、興味本位の質問です。

コマンドライン引数の文字列のサイズを取得しようとsizeofを使うと以下の結果になりました。

c

1#include <stdio.h> 2#include <string.h> 3 4int main(int argc, char const *argv[]) 5{ 6 printf("argv[0]: %s\n", argv[0]); 7 printf("sizeof(argv[0]): %zu\n", sizeof(argv[0])); 8 printf("strlen(argv[0]): %zu\n", strlen(argv[0])); 9 10 return 0; 11}

実行結果

terminal

1argc: 1 2sizeof(argv[0]): 8 3strlen(argv[0]): 46

気になったので、以下のループを回して余分にアドレスの中身を見ていると

c

1 for (size_t i = 0; i <500; i++) 2 { 3 printf("%c",argv[0][i]); 4 }

実行結果

terminal

1USER=username~~~~~

filenameの終端文字以降、user情報やパスなどいろいろ入っていました。
これは、私の実行環境特有のもので、実行されているプログラムと関係ないものなのか、何かセットのものなのか、何なのでしょうか。

追記
更に深く文字列を追っていくと、デバッグの情報や、エディタの情報が入っていたので、おそらく、実行されているプログラムに関係があるものだと思います。
ここらへんの原理を理解しようと思ったら私はMacを使っているのでLinuxや、gccのコンパイラの仕組みを理解すればわかるようになりますでしょうか?

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

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

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

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

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

tmp

2020/06/23 03:35

恐らく見えたのは、環境変数ではありませんか? その場合、mainが呼ばれる前のスタートアップルーチンを参照すれば、わかります。 int main( int argc, char *argv[], char *envp[] ) でもありますので、環境変数の引数も作成しますのでメモリ的に近いところで作成されると思われますので 見えたのだと思います。 しかし、スタートアップルーチンによって異なりますので、調べてもあまり意味がないと思います。
guest

回答3

0

ベストアンサー

質問で提示されている内容からすると見えているのは環境変数だと思います。 言語仕様の一部ではありませんが main がみっつめの引数を取れるように拡張している処理系はよくあります。 その場合、みっつめの引数の内容は環境変数です。 (C11 では J.5.1 に言及があります。)

main が要求したら渡せるようにスタートアップルーチンが事前に用意した分が見えてしまっているのかもしれません。 質問者が使っているコンパイラがそのような拡張を持っているかどうかはわかりませんが、みっつめの引数を受け取れるようならその内容を確認してみてはいかがでしょうか。

要するに

int main(int argc, char *argv[], char *envp[])

といった要領で受け取るということです。

環境変数がコマンドライン引数の直後に配置されているというのは、あくまでも実装上の偶然でしょうから将来もそうではあるとは限りませんが、コマンドライン引数に近い場所に環境変数が格納されていることがあったとしてもおかしくはないです。

投稿2020/06/23 03:38

SaitoAtsushi

総合スコア5444

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

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

Kchan_01

2020/06/23 05:01

char *envp[]で同様の文字列を引き出すことができました。 環境変数や、スタートアップルーチンというキーワードもありがとうございます!
guest

0

環境変数ならば大抵の環境では第3引数として渡されるので

c

1#include <stdio.h> 2 3int main(int argc, char** argv, char** envp) 4{ 5 for(int i = 0; envp[i]; i++) 6 puts(envp[i]); 7}

投稿2020/06/23 03:38

編集2020/06/23 03:38
asm

総合スコア15147

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

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

Kchan_01

2020/06/23 05:01

ありがとうございます!使わせていただきました。同様の文字列が確認できました!
guest

0

うーん...文字列の終端文字('\0')以降は参照すべきではないので...

投稿2020/06/23 02:50

編集2020/06/23 02:52
episteme

総合スコア16614

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

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

Kchan_01

2020/06/23 03:05

静的な領域だからコンパイル時に予想できない動作が起きる可能性があって危険ということでしょうか。デバッグで一行ずつ見ていっても危険なのでしょうか。
episteme

2020/06/23 03:09

いや危険とかそーゆーこっちゃなくて、「何が入っていようがおまえには関係ない」です。 もちろんそのプロセスに許された領域を超えて参照すれば何が起こっても文句言えないって意味では危険ですが。 # コンパイル時には問題ありません。実行時のおはなし。
Kchan_01

2020/06/23 04:43

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問