инициализировать массив, переданный указателем - PullRequest
0 голосов
/ 18 октября 2011

Функция не может инициализировать массив, потому что sizeof() возвращает байты int pointer не размер памяти, на который указывает myArray.

 void assignArray(int *myArray)
 {
     for(int k = 0; k < sizeof(myArray); ++k)
     {
         myArray[k] = k;
     }
 }

Есть ли другие проблемы?

Спасибо

Ответы [ 3 ]

6 голосов
/ 18 октября 2011

Ну нет, других проблем нет.Проблема, которую вы указали, - единственное, что мешает вам инициализировать массив.

Как правило, это решается простой передачей размера вместе с указателем:

void assignArray(int* myArray, std::size_t mySize)
{
    for (std::size_t k = 0; k < mySize; ++k)
        myArray[k] = k;
}

Обратите внимание, что ядля размера используется std::size_t, потому что это стандартный тип для хранения размеров (это будет 8 байт для 64-битных машин, тогда как int обычно нет).

В некоторых случаях, еслиразмер известен статически, тогда вы можете использовать шаблон:

template <std::size_t Size>
void assignArray(int (&myArray)[Size])
{
    for (std::size_t k = 0; k < Size; ++k)
        myArray[k] = k;
}

Однако это работает только с массивами, а не с указателями на выделенные массивы.

int array1[1000];
int* array2 = new int[1000];
assignArray(array1); // works
assignArray(array2); // error
3 голосов
/ 18 октября 2011

Я не вижу других проблем.Однако, вы, вероятно, хотели это:

template<int sz>
void assignArray(int (&myArray)[sz])
{
    for(int k = 0; k < sz; ++k)
    {
        myArray[k] = k;
    }
}

Если, конечно, даже компилятор не знает, насколько он велик во время компиляции.В этом случае вы должны передать размер явно.

void assignArray(int* myArray, size_t sz)
{
    for(int k = 0; k < sz; ++k)
    {
        myArray[k] = k;
    }
}

Если вы не знаете размера, у вас ошибка проектирования.

http://codepad.org/Sj2D6uWz

0 голосов
/ 18 октября 2011

Существует два типа массивов, которые вы должны различать. Один выглядит так:

type name[count];

Этот массив имеет тип type[count], который отличается для каждого count. Хотя он конвертируется в type *, он другой. Одно отличие состоит в том, что sizeof(name) дает вам count*sizeof(type)

Другой тип массива выглядит так:

type *name;

Это просто указатель, который можно инициализировать с помощью массива, например, malloc или new. Тип этой переменной - type *, и, как вы можете видеть, в этом типе нет информации count . Следовательно, sizeof(name) дает размер указателя на вашем компьютере, например 4 или 8 байт.

Почему эти два sizeof отличаются, спросите вы? Потому что sizeof оценивается во время компиляции. Рассмотрим следующий код:

int n;
cin >> n;
type *name = new type[n];

Теперь, когда вы говорите sizeof(name), компилятор не может знать возможное будущее значение n. Следовательно, он не может вычислить sizeof(name) как реальный размер массива. Кроме того, указатель name может даже не указывать на массив!

Что делать, спросите вы? Просто. Сохраняйте размер массива в переменной и перетаскивайте его туда, куда вы его берете. Так что в вашем случае это будет так:

void assignArray(int *myArray, int size)
{
    for(int k = 0; k < size; ++k)
    {
        myArray[k] = k;
    }
}
...