17

文字列リテラルへのポインタの配列が与えられた場合:

char *textMessages[] = {
    "Small text message",
    "Slightly larger text message",
    "A really large text message that "
    "is spread over multiple lines"
}

特定の文字列リテラルの長さをどのように決定しますか?3番目の文字列を言いますか?sizeofコマンドを次のように使用してみました。

int size = sizeof(textMessages[2]);

しかし、結果は、文字列リテラルの長さではなく、配列内のポインターの数のようです。

4

7 に答える 7

24

コンパイル時に(実行時にではなく)数値を計算する場合は、次strlenのような式を使用してもまったく問題ありません。

sizeof "A really large text message that "
       "is spread over multiple lines";

ただし、長いリテラルの繰り返しを避けるためにマクロを使用することをお勧めします。

#define LONGLITERAL "A really large text message that " \
                    "is spread over multiple lines"

によって返される値にsizeofは終了NULが含まれているため、。より1つ多いことに注意してくださいstrlen

于 2012-09-22T09:18:11.890 に答える
19

私の提案は、strlenを使用して、コンパイラの最適化をオンにすることです。

たとえば、x86のgcc4.7では次のようになります。

#include <string.h>
static const char *textMessages[3] = {
    "Small text message",
    "Slightly larger text message",
    "A really large text message that "
    "is spread over multiple lines"
};

size_t longmessagelen(void)
{
  return strlen(textMessages[2]);
}

実行後make CFLAGS="-ggdb -O3" example.o

$ gdb example.o
(gdb) disassemble longmessagelen
   0x00000000 <+0>: mov    $0x3e,%eax
   0x00000005 <+5>: ret

つまり、コンパイラはtoの呼び出しをstrlen定数値0x3e=62に置き換えました。

コンパイラーが実行できる最適化の実行に時間を無駄にしないでください。

于 2014-01-11T20:41:27.503 に答える
1

strlenは文字列の長さを示しますが、sizeofはパラメータとして入力したデータ型のサイズをバイト単位で返します。

strlen

のサイズ

于 2012-09-22T08:34:02.787 に答える
0

strlen多分?

size_t size = strlen(textMessages[2]);
于 2012-09-22T07:30:10.427 に答える
0

strlen()文字列の長さを取得するには、libraryメソッドを 使用する必要があります。sizeofポインタのサイズが表示さtextMessages[2]れます。これはマシンに依存します(4バイトまたは8バイト)。

于 2012-09-22T07:30:34.123 に答える
0

配列内の値が連続しているという事実を利用できます。

const char *messages[] = {
    "footer",
    "barter",
    "banger"
};

size_t sizeOfMessage1 = (messages[1] - messages[0]) / sizeof(char); // 7   (6 chars + '\0')

サイズは、要素の境界を使用して決定されます。最初の要素の先頭と2番目の要素の先頭の間のスペースは、最初の要素のサイズです。

これには、終了が含まれます\0。もちろん、このソリューションは定数文字列でのみ適切に機能します。文字列がポインタである場合、文字列の長さではなく、ポインタのサイズを取得します。

これが機能することは保証されていません。フィールドが整列している場合、これは間違ったサイズをもたらす可能性があり、同一の文字列をマージするなど、コンパイラによって導入される他の警告がある可能性があります。また、配列には少なくとも2つの要素が必要です。

于 2012-09-22T12:46:18.343 に答える
-1

私のナレッジ配列によると、ポインタは、を使用する場合を除いsizeofて同じものです。

ポインタで使用すると、ポインタが指しているものに関係なく、sizeof常に4 BYTEが返されますが、配列で使用すると、配列がバイト単位でどのくらいの長さであるかが返されます。

あなたの例では、ここ*textMessage[]にポインタの配列があるので、それを使用すると、はポインタであるため、 4バイトsizeof(textMessage[2])を返します。textMessage[2]

お役に立てば幸いです。

于 2012-09-22T12:17:08.413 に答える