3
#include<stdio.h>
int main()
{
    char arr[] = "somestring";
    char *ptr1 = arr;
    char *ptr2 = ptr1 + 3;
    printf("ptr2 - ptr1 = %ld\n", ptr2 - ptr1);
    printf("(int*)ptr2 - (int*) ptr1 = %ld",  (int*)ptr2 - (int*)ptr1);
    return 0;
}

理解します

 ptr2 - ptr1

3を返しますが、2番目のprintfが0を出力する理由を理解できません。

4

4 に答える 4

4

アドレス間の距離を調べたい場合は、(int *)または(void *)を使用しないでくださいptrdiff_t。 は、有効なポインタ減算演算の結果を表すことができる型です。

#include <stdio.h>
#include <stddef.h>

int main(void)
{
    char arr[] = "somestring";
    char *ptr1 = arr;
    char *ptr2 = ptr1 + 3;
    ptrdiff_t diff = ptr2 - ptr1;

    printf ("ptr2 - ptr1 = %td\n", diff);
    return 0;
}

編集: @chux で指摘されているように、 には文字を使用"%td"ptrdiff_tします。

于 2013-10-29T12:12:23.797 に答える
0

それの訳はsizeof(int) == 4

各文字は 1 バイトです。文字の配列は、メモリ内で次のようになります。

[s][o][m][e][s][t][r][i][n][g][0]

int の配列がある場合、各 int は 4 バイトを占有します。'1' と '2' の格納は、概念的に次のようになります。

[0][0][0][1][0][0][0][2]

したがって、整数は 4 バイト境界に揃える必要があります。コンパイラはアドレスを最小の整数境界にエイリアスしています。3 の代わりに 4 を使用すると、期待どおりに動作することに注意してください。

それを行うために減算を実行する必要がある理由 (キャストされたポインターを printf に渡すだけでは実行されません) は、printf厳密に型指定されていないためです。つまり%ld、パラメーターが int ポインターであるという情報が形式に含まれていないためです。 .

于 2013-10-29T12:17:22.743 に答える