2013-09-02 14 views
0

Как узнать размер массива с помощью указателя, выделенного с помощью malloc?Знание размера массива с помощью указателя

#include <stdio.h> 

int main(){ 
    int *ptr = (int *)malloc(sizeof(int * 10)); 
    printf("Size:%d",sizeof(ptr)); 
    free(ptr_one); 
    return 0; 
} 

я получаю только размер указателя в этом случае, который 8.How изменить код, чтобы получить размер массива, который будет 40.

+1

новый нет там c, использование malloc. – Gangadhar

+0

'printf (" 10 ")' Кроме того, вам придется столкнуться с зависимой от платформы (читаемой: нестандартной) памятью apis, и даже те, кто скорее всего работают только с динамическими выделениями, такими как выделение. Если вы хотите портативность, вам придется управлять этим самостоятельно. – WhozCraig

+0

'sizeof 'не может использоваться здесь, так как его вычисление происходит во время компиляции. он не знает о распределении времени выполнения. –

ответ

6

Вы не можете.
Вам нужно будет вести бухгалтерский учет и отслеживать его самостоятельно. С new вы выделяете динамическую память и, освобождая память, которую вы вызываете только delete, которая знает, сколько памяти она освобождает, потому что язык заботится о ней внутренне, так что пользователям не нужно беспокоиться о бухгалтерском учете. Если вы все еще нуждаетесь в этом явно, вам нужно отслеживать его через отдельную переменную.

+0

+1 для фактического чтения вопроса, а также кода (и, очевидно, для правильного ответа). – WhozCraig

+0

_ «Вам нужно будет вести бухгалтерский учет и следить за ним самостоятельно». Я предпочел бы использовать ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector) (или ['std :: array'] (http://en.cppreference.com/w/cpp/container/array)). _Edit_: oh, вопрос был изменен с 'C++' на 'c' ... –

+0

@gx_: Я не буду советовать этому прямо, не зная цели программы. Возможно, ОП просто хочет понять, как распределяется динамическая память. –

0

если ваша машина 32 бита вы будете получить размер указателя всегда 4 байта любого типа

данных, если ваша машина 64 бита вы получите размер указателя всегда 8 байт любого типа

данных, если объявить статический массив, вы получите размер с помощью sizeof

int a[10]; 

printf("Size:%lu",sizeof(a)); 

Но вы не получили размер массива, который блокируется указателем. где память для блока распределяется динамически с использованием malloc.

посмотреть код ниже:

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

int main() 
{ 
    int i; 
    int *ptr = (int *)malloc(sizeof(int) * 10); 
    // printf("Size:%lu",sizeof(ptr)); 
    // In the above case sizeof operater returns size of pointer only. 
    for(i=1;ptr && i<13 ;i++,ptr++) 
     { 
    printf("Size:%d %p\n",((int)sizeof(i))*i,ptr); 

     } 

    return 0; 
} 

выход:

Size:4 0x8ec010 
Size:8 0x8ec014 
Size:12 0x8ec018 
Size:16 0x8ec01c 
Size:20 0x8ec020 
Size:24 0x8ec024 
Size:28 0x8ec028 
Size:32 0x8ec02c 
Size:36 0x8ec030 
Size:40 0x8ec034 //after this there is no indication that block ends. 
Size:44 0x8ec038 
Size:48 0x8ec03c 
+4

Не вопрос, который он задал. Он хочет знать, как получить размер выделенного блока памяти, * указав ** на *** указателем под рукой. – WhozCraig

+0

Мне нужно знать выделенный размер массива – Prabu

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