【问题标题】:Access Violation with static arrays?静态数组访问冲突?
【发布时间】:2017-12-15 19:09:31
【问题描述】:

我需要使用 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;
    }
}

但是,在执行项目时,当我尝试通过 **array 指针访问数组时出现“访问冲突错误”。如果数组数据为 动态的。有没有办法解决这个问题(我不允许将数组数据从静态更改为动态)?

【问题讨论】:

  • 旁注:如果你不使用 MFC,你应该使用 _beginthreadex() 而不是 AfxBeginThread
  • 正如 Mehrdad 解释的那样,只需将 'float*array' 替换为 'floatarray' 然后手动计算索引。

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


【解决方案1】:

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

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

不正确,因为您要取消引用数组中的数字。 (您需要强制转换的事实也应该引起注意,因为数组已隐式转换为适当的指针类型。)

这就是为什么“数组只是指针”这句话不正确的原因;对于一维数组,它是一半正确的,但对于多维数组是完全错误的。如果您需要使用两个索引,请将单个索引转换为行列索引,方法是将行乘以行大小,然后添加列并使用指针对数组进行索引。

【讨论】:

  • 这就是为什么你永远不应该尝试用强制转换来“解决”分配不兼容的问题。
  • 是的...特别厌倦了指向指针的转换,因为如果你觉得你必须在典型的情况下这样做,那么你很可能是在踢自己的脚。 :)
猜你喜欢
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 2018-11-16
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多