Нарушение доступа со статическими массивами? - PullRequest
1 голос
/ 04 февраля 2011

Мне нужно распараллелить приложение, используя потоки win32.Одна из частей кода включает в себя изменение статического массива с использованием потоков.

Я передаю массив в качестве параметра следующим образом:

struct threadParameter {
   float **array;
   int row;
}

Пример кода будет выглядеть следующим образом:

// Main

float data[100][100]

for (int i = 0; i < 100; i ++) {
   tp = (*threadParameter) new threadParameter;
   tp->array = (float **) data;
   tp->row = i;
   AfxBeginThread... // Begin thread code
}

// Thread Code

UINT myThread(LPVOID param) {

    threadParameter *pp = (threadParameter *) param;
    for (int j = 0; j < 100; j ++) {
      pp->array[pp->row][j] = NEWVALUE;
    }
}

Однако при выполнении проекта яполучить «Ошибка нарушения доступа», когда я пытаюсь получить доступ к массиву через указатель массива **.Эта проблема не возникает, если данные массива являются динамическими.Есть ли способ решить эту проблему (мне не разрешено изменять данные массива со статических на динамические)?

1 Ответ

7 голосов
/ 04 февраля 2011

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

tp->array = (float **) data;

неверно, потому что вы разыменовываете число внутри массива.(Тот факт, что вам нужно было также привести к приведению, должен был поднять красный флаг, поскольку массивы неявно преобразуются в соответствующие типы указателей.)

Вот почему общая фраза «массивы - это просто указатели» неверна;это наполовину верно для одномерных массивов, но полностью неверно для многомерных массивов.Если вам нужно использовать два индекса, преобразуйте один индекс в индекс столбца строки, умножив строку на размер строки, затем добавив столбец и индексировав в массив указатель.

...