#include <stdio.h>
static char a[] = "text";
static char *b = "text";
int main (int argc, char *argv[]) {
printf ("size of a is %d\n"
"size of b is %d\n",
sizeof (a), sizeof (b));
return 0;
}
#include <stdio.h>
#include <string.h>
static char a[] = "text";
static char *b = "text";
int main (int argc, char *argv[]) {
printf ("size of a is %d [%d]\n"
"size of b is %d [%d]\n",
sizeof (a), strlen(a), sizeof (b), strlen(b));
return 0;
}
>> ./a.out
size of a is 5 [4]
size of b is 4 [4]
Как тогда обеспечивается '\0' для строки b? Компилятором «за кадром»? Ведь я ее могу использовать в функциях из string.h, а, следовательно, нулевой символ обязан быть.
Он там есть, как и в любом другом строковом литерале. Не забывай, что b - указатель. Первая 4 для b говорит о том, что размер указателя в твоей системе - 4 байта.
Ведь я ее могу использовать в функциях из string.h, а, следовательно, нулевой символ обязан быть.
>Ну а суть этого одна и та же
не одна и та же!
указатель - это прежде всего переменная, которая, помимо той памяти, на которую указывает, также занимает память.
>массивы переводит в указатели
вы читали не те книги. правильней сказать: переводит имя массива в адрес первого элемента.
дополнительной переменной для хранения адреса тут не создается.
КиР, конечно, хорошо, но, учитывая, что на форуме периодически появляются темы а-ля «не компилиться пример из K&R», я бы проверял неочевидные вещи на практике :)
хоть это и мелочи, они способствуют правильному пониманию логики компилятора.
>Для глобальных переменных есть разница, для параметров функции - нет.
кто ж вас плодит-то.
сделай дамп стека для
foo(char *)
и для
foo(char[])
вдруг чего новое увидишь :)
foo1:
0x0022ccf0 AA AA AA AA 00 00 00 00 BB BB BB BB EA 10 40 00 ..............@.
foo2:
0x0022ccf0 CC CC CC CC 00 00 00 00 DD DD DD DD EA 10 40 00 ..............@.
На машине с размером указателя 4 байта выделится память под указатель (4 байта) и память для хранения 4 символов и 1 символа завершающего нуля. Итого имеем: 4 + 4 + 1 = 9 байт.