使用静态数组访问冲突?

时间:2011-02-04 01:24:32

标签: c++ multithreading pointers winapi access-violation

我需要使用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 个答案:

答案 0 :(得分:7)

静态数组不是指针的指针 - 整个数组是单个巨大的数据块,并且可以通过单个指针寻址,即指向数组基址的指针。因此

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

不正确,因为你在数组中取消引用一个数字。 (你需要强制转换的事实也应该引发一个红旗,因为数组被隐式转换为适当的指针类型。)

这就是为什么常见的短语“数组只是指针”是不正确的;它对于一维数组来说是半真的,但对于多维数组则完全错误。如果需要使用两个索引,请将单个索引转换为行列索引,方法是将行乘以行大小,然后使用指针将列和索引添加到数组中。