Поскольку вам интересно знать адреса, возвращаемые malloc()
, вам следует убедиться, что вы печатаете их правильно. Под «правильно» я подразумеваю, что вы должны использовать правильный спецификатор формата для printf()
для печати адресов. Почему вы используете "%u"
для одного и "%d"
для другого?
Вы должны использовать "%p"
для печати указателей. Это также один из редких случаев, когда вам нужно преобразование в C: поскольку printf()
является функцией с переменным числом, компилятор не может сказать, что указатели, которые вы передаете в качестве аргумента, должны иметь тип 1009 * или нет.
Кроме того, вы не должны приводить возвращаемое значение 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 указателей, и адреса этих четырех указателей расположены рядом друг с другом. Вы можете увидеть это более четко, выполнив:
printf("%d\n", (int)(&stringArr[1] - &stringArr[0]));
Это должно вывести 1.
О последующих malloc()
с, поскольку каждый stringArr[i]
получен из отдельного malloc()
, реализация может назначать им любые подходящие адреса. В моей реализации при этом конкретном запуске все адреса разделяются на 0x10 байт.
Для вашей реализации кажется, что char **
указатели имеют длину 4 байта.
Что касается адресов вашей отдельной строки, похоже, что malloc()
выполняет какую-то рандомизацию (что разрешено делать).