使用静态数组访问冲突?

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)

但是,在执行项目时,当我尝试通过**数组指针加入数组时,出现"访问冲突错误".如果阵列数据是动态的,则不会发生此问题.有没有办法解决这个问题(我不允许将数组数据从静态更改为动态)?

Meh*_*dad 7

静态数组不是指向指针的指针-整个阵列是一个单一数据的大块,和具有单指针,即指针数组的基本寻址的.于是

tp->array = (float **) data;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这就是为什么你永远不应该尝试"解决"与转换的赋值不兼容. (4认同)