Размер памяти, выделенной malloc

Я назначаю новый блок памяти указателю, но, очевидно, размер блока не тот, который я передаю в качестве параметра для malloc

char *q="tre";
printf("q in main %zu\n", sizeof(q));
q = (char*)malloc(6);
printf("q in main %zu\n", sizeof(q));

Выходы

8
8

Однако указатель указывает на новый фрагмент памяти. Как это возможно?

4 ответа

char *q;
printf("%zu\n", sizeof(q));

sizeof(q) относится к размеру указателя, а не к объему памяти, на который он указывает.

sizeof возвращает размер указателя, в вашем случае это (char*), это не даст памяти, выделенной malloc, Храните объем памяти в отдельной переменной для последующего использования.

sizeof(q) возвращает размер указателя q который на 64-битной машине будет 8 байтов, а не размер блока памяти, выделенного по этому указателю. sizeof это время компиляции, а не время выполнения.

Мне не ясно, что вы хотите сделать здесь, но если вы хотите выделить достаточно памяти для строки в месте sтогда вы хотите malloc(strlen(s)+1) (+1 за прекращение NULL).

Возможно, вы хотите получить размер malloc()Ред блок. Существует не портативный способ сделать это, насколько мне известно, но malloc_usable_size почти делает это на glibc, Со страницы руководства:

malloc_usable_size() возвращает количество байтов, доступных в динамически распределенном буфере ptr, которое может быть больше, чем запрошенный размер (но гарантированно будет по крайней мере таким же большим, если запрос был успешным). Как правило, вы должны хранить запрошенный размер выделения, а не использовать эту функцию.

Обратите внимание на последнее предложение.

То, что вы получаете, это размер переменной q как тип указателя. В общем, все указатели будут иметь одинаковый размер в вашей программе.

Поскольку 8 байтов являются 64-битными, кажется, вы делаете 64-битные приложения.:)

Другие вопросы по тегам