
技術的興味からです。
ポインタのsizeを知りたくてpointerをsizeofにかけたのですが出てきませんでした。
c
1char * a ="hoge"; 2printf("%d",*hoge);
いろんなサイトを当たってポインタの中身のサイズは出すことができないと書いてあったのですが例えばcharの配列のサイズは出せるのにポインタの文字列のサイズが出せないのはどうしてでしょうか?
出す方法はありませんか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
文字数を知りたいということでしょうか。その場合はstrlen
関数を使います。
C
1char * str = "hoge123"; 2size_t len = strlen(str); // len == 7
投稿2016/07/20 08:16
総合スコア5944
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
総合スコア6191
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
総合スコア23274
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。