2016-02-04 2 views
0

Я озадачен выходом этого кода:Неправильный размер при выделении динамической памяти

#include <stdio.h> 
#include <stdlib.h> 

#define TIMING_OUTPUT_FILENAME_MAX_LENGTH 40 

    int main (int argc, char **argv) 
    { 
     char *timing_output_filename = malloc(TIMING_OUTPUT_FILENAME_MAX_LENGTH); 
     printf("requested buffer size is %ld bytes and pointer size is %ld bytes\n", 
     sizeof(timing_output_filename), 
     sizeof(*timing_output_filename)); 

     return 0; 
    } 

и вот результат:

requested buffer size is 8 bytes and pointer size is 1 bytes 

Он должен вернуть мне 40 байт? Я что-то упускаю?

+3

Указатели не являются массивами. –

ответ

5

Предполагается вернуть мне 40 байт?

Нет, это не так.

В вашем коде timing_output_filename является указателем и с помощью оператора sizeof оператор на указателе дает размер самого указателя, а не размер выделенной памяти (указателю).

В вашем коде sizeof(timing_output_filename) это то же самое, что и sizeof(char *), поэтому он производит размер указателя на char, как и на вашей платформе.

Примечание: sizeof дает результат типа size_t, поэтому для печати результата необходимо использовать спецификатор формата %zu.

+0

согласен. Но как я знаю, что он ** действительно ** выделил мне 40 байт? –

+0

@Black_Zero Что значит ** действительно **? Проверьте возвращаемое значение, установите флажок NULL. –

+0

@Black_Zero Он либо вернет указатель на память с запрошенным размером, либо возвращает NULL. между ними нет ничего. :) –

Смежные вопросы