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

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

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

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

Q&A

解決済

3回答

55797閲覧

c言語でポインタのsizeofが出したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2016/07/20 07:06

技術的興味からです。

ポインタのsizeを知りたくてpointerをsizeofにかけたのですが出てきませんでした。

c

1char * a ="hoge"; 2printf("%d",*hoge);

いろんなサイトを当たってポインタの中身のサイズは出すことができないと書いてあったのですが例えばcharの配列のサイズは出せるのにポインタの文字列のサイズが出せないのはどうしてでしょうか?
出す方法はありませんか?

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

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

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

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

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

guest

回答3

0

文字数を知りたいということでしょうか。その場合はstrlen関数を使います。

C

1char * str = "hoge123"; 2size_t len = strlen(str); // len == 7

投稿2016/07/20 08:16

catsforepaw

総合スコア5938

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

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

0

ベストアンサー

ポインタのsizeを知りたくてpointerをsizeofにかけたのですが出てきませんでした。

ポインタ型のサイズであれば、そのままsizeof演算子の対象にできます。

C

1char * a = "hoge"; 2printf("%zu", sizeof(a)); // char*型のサイズ 3または 4printf("%zu", sizeof(char*)); // char*型のサイズ

いろんなサイトを当たってポインタの中身のサイズは出すことができないと書いてあったのですが例えばcharの配列のサイズは出せるのにポインタの文字列のサイズが出せないのはどうしてでしょうか?

下記のような事を指していますか?配列型はそれ自身に「要素数」という情報を含んでいるため、文字列のサイズを取り出せています。一方のポインタ型には指す先のサイズという情報は含まれないため、下記のような結果になります。

C

1char s1[] = "Hello, world!"; 2assert(sizeof(s1) == 14); // 13文字+NUL終端で14バイト 3 4char *p1 = "Hello, world!"; 5assert(sizeof(p1) != 14); // ポインタ型からは文字数を直接取得できない

投稿2016/07/20 07:35

yohhoy

総合スコア6191

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

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

退会済みユーザー

退会済みユーザー

2016/07/20 13:52

リテラルプールとかその辺ですね。 3方ともありがとうございました。 詳しく教えていただいたのでyohhoyさんをBAにしたいと思います。
yohhoy

2016/07/20 14:25

(どの文脈でリテラルプールが出てきたんでしょう?)
guest

0

こんにちは。

まず、ポインタ変数のバイト数は、単純にsizeof演算子で計算できます。
32bitビルドなら4、64bitビルドなら8が出力されます。

C

1char *pointer; 2printf("%d\n", sizeof(pointer));

(pointerを初期化していませんが、ポインタ変数のサイズを計算しているだけなので、pointerの内容をアクセスしてないですから、問題なく動作します。)

次に配列のサイズもsizeof演算子で計算できます。
下記では10と表示される筈です。

C

1char array[10]; 2printf("%d\n", sizeof(array));

さて、問題は下記ですね?

C

1char *pointer="123456789"; 2printf("%d\n", sizeof(*pointer));

期待値としては、pointerが指す領域サイズの10を表示して欲しいということかと思います。
実際には*pointerはchar型ですからsizeof(char)と同じなので1と表示されます。

sizeof演算子はコンパイラがソース・コードを見て計算してます。
どのような順序で実行されたかに関わらず、ソースだけから分かる情報でのみ計算できます。

C

1char *pointer; 2int foo; 3scanf("%d", &foo); 4if (foo == 0) 5 pointer=""; 6else 7 pointer="abc"; 8printf("%d\n", sizeof(*pointer));

このようなプログラムの場合、コンパイラはpointerに""が設定されているのか、"abc"が設定されているのか知ることができません。
従って、ポインタの先の配列サイズをsizeof演算子で計算することはできないため、sizeof演算子は上記のような仕様となってます。

どうしても必要な場合は、別途配列の要素数変数を用意しておくしかありません。
例えば、下記のような構造体を定義し、pointerへアドレス設定する際に、そのアドレスに格納されている配列の要素数をCountへ設定します。

C

1struct Array 2{ 3 int Count; 4 char* pointer; 5};

C++言語なら直感的に使えるArrayクラスを定義することができます。

投稿2016/07/20 07:30

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問