0

重複の可能性:
C -> sizeof string は常に 8

文字列を作成する次の方法を見つけました。

#include <stdio.h>
#include <string.h>

int main(void) {
    char *ptr = "this is a short string";
    int count = sizeof ptr / sizeof ptr[0];
    int count2 = strlen(ptr);
    printf("the size of array is %d\n", count);
    printf("the size of array is %d\n", count2);
    return 0;
}

で長さを取得する通常の方法を使用できませんsizeof ptr / sizeof ptr[0]。この文字列を作成する方法は有効ですか? 彼の記法についての長所と短所はありますか?

4

4 に答える 4

2

これを行うと

char *ptr = "this is a short string";

ptr は実際にはスタック上のポインターです。読み取り専用メモリ上の文字列リテラルを指します。

[ptr] ---->  "This is a short string"

したがって、sizeof ptr を取得しようとすると、その特定のマシンでは常に int のサイズに評価されます。

しかし、これを試してみると

char ptr[]="this is a short string";

次に、実際には文字列全体に対してptr、配列の開始アドレスを持つメモリがスタック上に作成されます

|t|h|i|s| |i|s| | |a| |s|h|o|r|t| |s|t|r|i|n|g|\0|

|' '| ==> これは実際には上の図に示されているバイトであり、ptr は |t| のアドレスを保持します。

したがって、 size ofptrは配列全体のサイズを示します。

于 2012-10-22T08:11:10.430 に答える
1

はい、strlen を使用して文字列のサイズを取得することは有効です。さらにstrlen、文字列のサイズを取得する適切な方法です。ここでの sizeof ソリューションは間違っています。ポインタのサイズを char のサイズで割ったものであるため、64 ビット システムでsizeof ptr返されます。つまり、 のみが得られます。818

文字列のサイズを取得するために使用できる唯一のケースsizeofは、文字の配列 ( char[]) として宣言されている場合です。

于 2012-10-22T07:57:34.897 に答える
1

配列ptrではなくポインタだからです。の代わりにを使用すると、ほぼ正しい結果が得られます。22 ではなく、23 になります。これは、配列のサイズには でカウントされない終了バイトも組み込まれているためです。char ptr[]char *ptrNULstrlen()

ちなみに、このように文字列を「作る」ことは(ほぼ)有効ですが、文字配列を使わないと、コンパイラが定数文字列の配列のアドレスでポインタを初期化するので、本当に

`const char *ptr`

あなたが今持っているものの代わりに(つまり、const修飾子を追加してください)。

于 2012-10-22T07:59:12.313 に答える
0

このコードは、文字列を変更するとクラッシュします (最近のコンパイラは文字列を定数と見なすため)。さらに、 sizeof(ptr) は文字列のサイズではなくポインターのサイズを返すため、誤った結果が返されます。

あなたはむしろ書くべきです:

char ptr[] = "this is a short string";

このコードにより、文字列の長さを見つけたり、文字列の内容を変更したりできるためです。

于 2012-10-22T07:57:45.490 に答える