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

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

詳細はこちら
C

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

4回答

1030閲覧

C言語 ポインタ変数にアドレスではない文字列を代入している

kazuyakazuya

総合スコア193

C

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/09/06 00:39

C言語のファイル操作の記事を読んでいたのですが
不明点があったのでお願いします。
参考記事
イメージ説明

c

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(int argc, char** argv) 5{ 6 FILE* fp; 7 char buf[1024]; 8 char* cmd = "/usr/bin/ls -l /"; 9 10 if ((fp = popen(cmd, "r")) != NULL) { 11 while (fgets(buf, sizeof(buf), fp) != NULL) { 12 printf("%s", buf); 13 } 14 pclose(fp); 15 return 0; 16 } 17 return -1; 18} 19

上記のコードの中の

c

1 char* cmd = "/usr/bin/ls -l /";

この部分。
char型のcmdポインタ変数に文字列を入れているのですが
どういうことなのでしょうか?
本来アドレスを入れるのですよね?
分からないので参考になるリンクまたは説明をお願いします。

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

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

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

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

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

guest

回答4

0

char型のcmdポインタ変数に文字列を入れているのですが

どういうことなのでしょうか?
本来アドレスを入れるのですよね?

いえ、これもアドレス代入です。C言語の文字列リテラルは基本的にconst char[](基本となるcharは環境によって変わるかもしれませんが、constな配列であることは共通です)として扱われ、式の中では一部の箇所を除いて先頭を指すアドレスとして解釈されます。

投稿2019/09/06 00:43

maisumakun

総合スコア145963

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

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

maisumakun

2019/09/06 00:44

文字列定数を書き換えるとトラブルのもとになるので(何が起きても知らない未定義動作の世界に突入する)、const char *で受けるべきだとは思います(C++だとコンパイルエラーになったかもしれません)。
kazuyakazuya

2019/09/06 01:35

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

0

やっぱり基礎から勉強して下さい。
C言語 ポインタ変数 scanf_s 第二引数へ指定する
で、回答(コメント)に有ると思いますが、全く分かってない。
「追記」前回書いた内容をもう一回書きます。
“"World"は配列(コンパイラが割り当てた領域に格納される)です、従って"World"の先頭アドレスがchar *jmojiに代入されます。ちなみに"World"のようにプログラムに、じかに書かれた文字列は文字列リテラルといいます。OSによっては(組み込み系のような)ROM領域に格納されます。
char str[]="World";とは違います。←これは配列の初期化。 ”

投稿2019/09/06 01:01

編集2019/09/06 01:10
cateye

総合スコア6851

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

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

cateye

2019/09/06 01:18 編集

アセンブルソース見れば一発なんだけど・・・w “文字列リテラル”で検索しましょう、
kazuyakazuya

2019/09/06 01:35

文字リテラルの認識が甘かったです。 ありがとうございます。
guest

0

ベストアンサー

まず。C言語には「文字列」という基本型はありません。
C言語において文字列とは、
char型の配列で、データ並びの最後にNUL文字'\0'が終端のマークとして付けられているもの
ということになっています。なので、文字列は根っこのところで配列です。

そして、先日の質問への回答で書きましたけど、C言語では配列の扱いを、ほぼ配列の先頭要素へのポインタとみなします。
なので、文字列を管理するのはcharへのポインタ型、ということになります。

「管理するのは」と書きましたけど、文字列のデータそのものはchar型の配列に格納されていて、ポインタはその配列を指しているだけだ、という理解は必要です。

なお、今回は文字列が「リテラル」(定数)なので、定数の中身は書き換えられないということを盛り込んで
const char* cmd = "/usr/bin/ls -l /";
とするほうがベター(型に厳しいC++だとmust)とは思います。

ついでにいうと、これはご存知かと思いますが、
char cmdVal[17]="/usr/bin/ls -l /";
としたときには、cmdValはchar型の配列で、宣言時に"/usr/bin/ls -l /"と'\0'がコピーされます。配列の要素数を省略すると、配列の要素数はコンパイラが最小限を設定してくれます。

以上から、

C

1#include <stdio.h> 2char cmdVal_l[]="/usr/bin/ls -l /"; 3char cmdVal_a[]="/usr/bin/ls -a /"; 4char *cmd; 5int main(void){ 6 cmd=cmdVal_l; 7 printf("%s\n",cmd); 8 cmd=cmdVal_a; 9 printf("%s\n",cmd); 10 return 0; 11}

とすれば、
/usr/bin/ls -l /
/usr/bin/ls -a /
が順次出力される、というのはいいですね?
しかし、

C

1#include <stdio.h> 2char cmdVal_l[]="/usr/bin/ls -l /"; 3char cmdVal_a[]="/usr/bin/ls -a /"; 4char cmd[17]; 5int main(void){ 6 cmd=cmdVal_l; 7 printf("%s\n",cmd); 8 cmd=cmdVal_a; 9 printf("%s\n",cmd); 10 return 0; 11}

というプログラムはエラーになる、というのが腑に落ちるようなら大丈夫でしょう。

投稿2019/09/06 01:22

thkana

総合スコア7703

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

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

kazuyakazuya

2019/09/06 01:36

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

0

ポインタ変数に、文字配列のアドレスを入れています
なのでこれは正しいです。

どこかに配置された"/usr/bin/ls -l /"という内容の文字配列のアドレスをここで代入してます
C言語では、配列はそのアドレスとして読み替えることができるってことになっとります

投稿2019/09/06 00:41

編集2019/09/06 00:43
y_waiwai

総合スコア88038

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

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

kazuyakazuya

2019/09/06 01:35

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問