fly5728 さんが書きました:これを実行すると
9
1000086
という結果になります。どうしてでしょうか。
cには終端のナル文字が含まれていないので、範囲外の読み込みが発生し、未定義動作になります。
どうしてこの結果になるのかを調べるため、printfを追加した以下のコードを
実行してみました。
コード:
#include <stdio.h>
#include <stdlib.h>
int main(){
int a;
char c;
a = 999990;
c = '9';
printf("&c = %p, &a = %p, atoi(&c) = %d\n", (void*)&c, (void*)&a, atoi(&c));
a += atoi(&c);
printf("%d\n", atoi(&c));
printf("%d\n", a);
return 0;
}
結果は、
コード:
&c = 0x7ffefd1c3c3b, &a = 0x7ffefd1c3c3c, atoi(&c) = 96
9
1000086
となりました。
この環境では、たまたまaがcの直後に配置されているため、atoiはcを処理した後aに格納されているデータを読み出します。
a = 999990のとき、この値は16進数では0xF4236です。
従って、int型が4バイト、リトルエンディアンの環境だとすると、メモリ上のデータは
コード:
┏━┳━━━━━━━┓
┃c ┃a ┃
┠─╂─┬─┬─┬─┨
┃39┃36│42│0F│00┃
┗━┻━┷━┷━┷━┛
となります。
従って、&cから始まる「文字列」は、ASCIIコードだとすると"96B(制御文字)"となります。
atoiの処理は無効な文字で止まるので、これは96に変換され、aは999990 + 96 = 1000086となります。
1000086は16進数で0xF4296なので、int型が4バイト、リトルエンディアンの環境の場合、メモリ上のデータは
コード:
┏━┳━━━━━━━┓
┃c ┃a ┃
┠─╂─┬─┬─┬─┨
┃39┃96│42│0F│00┃
┗━┻━┷━┷━┷━┛
となり、\x96は数字として無効なので、この時&cから始まる「文字列」は9に変換されます。
box さんが書きました:atoi()に渡す引数の型が違ってるようです。
引数として渡しているデータの型はchar*であり、atoiが受け付ける引数の型はconst char*なので、型自体は間違っていません。