Jav*_*cia 1 c++ winapi multithreading pointers access-violation
我需要使用win32线程并行化应用程序.代码的一部分涉及使用线程修改静态数组.
我将数组作为参数传递如下:
struct threadParameter {
float **array;
int row;
}
Run Code Online (Sandbox Code Playgroud)
示例代码如下:
// 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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在执行项目时,当我尝试通过**数组指针加入数组时,出现"访问冲突错误".如果阵列数据是动态的,则不会发生此问题.有没有办法解决这个问题(我不允许将数组数据从静态更改为动态)?
静态数组不是指向指针的指针-整个阵列是一个单一数据的大块,和具有单指针,即指针数组的基本寻址的.于是
tp->array = (float **) data;
Run Code Online (Sandbox Code Playgroud)
是不正确的,因为你在数组中取消引用一个数字.(你需要强制转换的事实也应该引发一个红旗,因为数组被隐式转换为适当的指针类型.)
这就是为什么常见的短语"数组只是指针"是不正确的; 它对于一维数组来说是半真的,但对于多维数组则完全错误.如果需要使用两个索引,请将单个索引转换为行列索引,方法是将行与行大小相乘,然后使用指针将列和索引添加到数组中.