によって返されるアドレスを知ることに興味があるので、malloc()
それらを正しく印刷していることを確認する必要があります。「適切に」とは、printf()
アドレスを印刷するために適切なフォーマット指定子を使用する必要があることを意味します。なぜあなた"%u"
はあるものと"%d"
別のもののために使っているのですか?
"%p"
ポインタの印刷に使用する必要があります。これは、Cでのキャストが必要なまれなケースの1つでもあります。printf()
可変個引数関数であるため、コンパイラは、引数として渡すポインタが型である必要があるvoid *
かどうかを判断できません。
また、の戻り値をキャストしないでくださいmalloc()
。
上記を修正すると、プログラムは次のようになります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char **stringArr;
int size=4, i;
stringArr = malloc(size * sizeof *stringArr);
for (i=0; i < size; i++)
stringArr[i] = malloc(10 * sizeof *stringArr[i]);
strcpy(stringArr[0], "abcdefgh");
strcpy(stringArr[1], "good-luck");
strcpy(stringArr[2], "mully");
strcpy(stringArr[3], "stam");
for (i=0; i<size; i++) {
printf("%s\n", stringArr[i]);
printf("%p %p\n", (void *)(&stringArr[i]), (void *)(stringArr[i]));
}
return 0;
}
実行すると、次の出力が得られます。
abcdefgh
0x100100080 0x1001000a0
good-luck
0x100100088 0x1001000b0
mully
0x100100090 0x1001000c0
stam
0x100100098 0x1001000d0
私のコンピューターでは、char **
ポインターの長さは8バイトなので、&stringArr[i+1]
は8バイト大きくなり&stringArr[i]
ます。これは標準によって保証されています。スペースがある場合malloc()
、そのスペースは隣接しています。4つのポインターにスペースを割り当てましたが、これらの4つのポインターのアドレスは隣り合っています。次のようにすると、それをより明確に確認できます。
printf("%d\n", (int)(&stringArr[1] - &stringArr[0]));
これは1を出力するはずです。
後続malloc()
のsについては、それぞれstringArr[i]
が別々のから取得されるためmalloc()
、実装はそれらに適切なアドレスを自由に割り当てることができます。私の実装では、その特定の実行では、アドレスはすべて0x10バイト離れています。
あなたの実装では、char **
ポインタは4バイトの長さのようです。
個々の文字列のアドレスについては、malloc()
ある種のランダム化を行っているように見えます(これは許可されています)。