2014-11-18 3 views
1

Это может быть из-за мое отсутствие понимания C, но я получаю некоторые (то, что я бы назвал) непонятные ошибки при работе с массивами:Странных ошибок массива C

Вот код:

int * generateRandomArray(int numPageReplacements) { 
    // Seed random number generator 
    srand(time(NULL)); 

    int * randPages = (int *)malloc(sizeof(int)*numPageReplacements); 

    for (int i = 0; i < numPageReplacements; i++) { 
     randPages[i] = rand() % 10;  // generate (with uniform distribution) number 0 - 9 
     printf("%d ", randPages[i]); // for testing purposes 
    } 
    printf("\nRandomPages[3] = %d \n" ,randPages[3]); 
    return randPages; // return array pointer 
} 

Выход:

7 9 4 6 4 6 5 7 6 3 
RandomPages[3] = 6 
Program ended with exit code: 0 

Если я запускаю эту спина к спине (принимать случайные числа, сгенерированные выше), это даст 4 иногда (что можно было бы ожидать) и 6 на других (это как он не знает границы каждого массива ce LL).

При попытке получить массив из этой функции от вызова:

int * ary = generateRandomArray(int numPageReplacements); 
printf("Size of ary = %lu",sizeof(ary)); 

Выход:

Size of ary = 8 

Ни равно 8 независимо от того, ЧТО numPageReplacements есть.

Компилятор:

Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) Target: x86_64-apple-darwin14.0.0 Thread model: posix

ли я что-то пропустил?

+1

'ary' is 8, потому что вы печатаете размер указателя, а не выделенный объем памяти. – SSC

+2

Массив начинается с нуля, то есть randPages [0] == 7, randPages [1] == 9, randPages [2] == 4, randPages [3] == 6, ... – Casperah

+0

Возможный дубликат [How to найти «sizeof» (указатель, указывающий на массив)?] (http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pinter-pointing-to-an-array) – dandan78

ответ

4

Вызов sizeof на указателе дает вам только размер этого указателя, что и есть ary. Массив будет int ary[10];

Вы работаете с динамически распределенной памятью, а не с массивами. Конечно, они работают как массивы, вроде, потому что вы можете использовать [] для доступа к своим элементам, но под капотом они очень разные звери.

Просто так вы знаете, что нет способа узнать, насколько велика массив или даже если это массив, а не только адрес одного int, который передается функции. Указатель просто сохраняет адрес памяти. Интерпретация того, что находится по этому адресу, зависит от программиста. Вот почему функции C, которые принимают массивы/буферы, всегда принимают размер этого массива/буфера в качестве отдельного параметра.

+0

спасибо Дэн. на самом деле не думал об этом. ссылка на то, как найти размер указателя на массив (или его отсутствие), - это то, что я ищу – user2243357

+0

Нет проблем. Проверьте мой отредактированный ответ для получения дополнительной информации. – dandan78

0

sizeof (ary), ary - целочисленный указатель и его размер составляет 8 байтов (64 бит) на 64-битной машине, на которой вы работаете.

+0

имеет смысл для меня (сейчас)! – user2243357

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