掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26728

char* aとchar b[]の違い
投稿者---def(2006/05/03 17:32:54)


#include <iostream>
using namespace std;

int main()
{
    char*   a  ="ABCDE";
    char    b[] ="ABCDE";
    cout<<"char* a: "<<sizeof a<<endl<<"char b[]: "<<sizeof b<<endl;
    return 0;
}


として、実行結果を表示すると
char* a: 4
char b[]: 6
と表示されるのですが、char b[]が文字数と最後のnull文字で6文字なのはわかるのですが、char* aが4の意味がわかりません。
sizeofの使い方が間違っているのでしょうか。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:char* aとchar b[]の違い 26729 あかま 2006/05/03 17:59:12


No.26729

Re:char* aとchar b[]の違い
投稿者---あかま(2006/05/03 17:59:12)


>char* a: 4
これはchar型のポインタ。ポインタの指し示す先に"ABCDE"がある。
ポインタのサイズは4
>char b[]: 6
これはchar型の配列。配列の中に"ABCDE"のデータが入ってる。
配列の長さchar型6文字分なので6。


だからもし文字列の長さを測りたいならsizeofじゃなくてstrlenを使う。


ついでに私からも質問。
配列のサイズを処理系によっては4の倍数にそろえるところもあると思う。
char b[6];って宣言してても8バイト確保しちゃうような。
そういうときはsizeofの値はどうなるんでしょうか?



この投稿にコメントする

削除パスワード

No.26730

Re:char* aとchar b[]の違い
投稿者---KING・王(2006/05/03 18:12:44)


>ついでに私からも質問。
>配列のサイズを処理系によっては4の倍数にそろえるところもあると思う。
>char b[6];って宣言してても8バイト確保しちゃうような。
>そういうときはsizeofの値はどうなるんでしょうか?

えっ、そんな処理系があるのですか?
各変数を必ず4の倍数のアドレスから確保するのならわかるのですが・・・

たとえば、

char strA[6];
char strB[6];
char strC[6];

とした際に、各変数の先頭のアドレスが、
strAは0x00, strBが0x08, strCが0x10となるが、
strAはあくまで0x00から0x05までの6バイトで、
0x06と0x07は使用されていないだけ、になるようなことはあったと思いますが。


この投稿にコメントする

削除パスワード

No.26732

Re:char* aとchar b[]の違い
投稿者---あかま(2006/05/03 18:28:14)


>各変数を必ず4の倍数のアドレスから確保するのならわかるのでが・・・
>strAはあくまで0x00から0x05までの6バイトで、0x06と0x07は使用されていないだけ
おぉ、なるほど。たしかにそのとおりです。
考え方そのものが間違ってたようです。
パティングなどは"確保されている"のではなく、ただ"空いている"だけですね。
sizeofの値が変わろうはずもありません。

ありがとうございました。


この投稿にコメントする

削除パスワード

No.26733

Re:char* aとchar b[]の違い
投稿者---Hermit(2006/05/03 19:15:04)


>パティングなどは"確保されている"のではなく、ただ"空いている"だけですね。
>sizeofの値が変わろうはずもありません。

ただ開いているだけでは、パディングではない気がしますが。
パディングである以上は、領域が確保されなければいけないと思います。

struct foo {
char j[3];
}

が、

struct foo bar[100];
が、必ず奇数番地から領域確保される処理系で、
sizeof bar が、3*100 か、4*100 かでは、
同一領域確保するための malloc に渡す数値が変わってしまいますから。


この投稿にコメントする

削除パスワード

No.26734

Re:char* aとchar b[]の違い
投稿者---Hermit(2006/05/03 19:24:50)


前の書き込みの
char strA[6];
char strB[6];
char strC[6];
の場合のアドレスの位置が、4 の倍数になる処理系は、
有ってもおかしくはないですが、
それはパディングではありません、
処理を最適化するために、領域確保位置をコンパイラが変えているだけで
単純に空けているだけです。
sizeof で返される数値のみが、確保されるべき領域のサイズであり、
パディングの入っている領域サイズです。


この投稿にコメントする

削除パスワード

No.26731

Re:char* aとchar b[]の違い
投稿者---def(2006/05/03 18:14:11)


ありがとうございますぅぅ.....orz(こんな事も知らなかった

質問の答えの一つですが私の環境では6でした。
WindowsXP
VisualStudio2005


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧