首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么会导致指针从双倍*转换到双倍**导致写访问冲突?

为什么会导致指针从双倍*转换到双倍**导致写访问冲突?
EN

Stack Overflow用户
提问于 2017-04-18 19:11:04
回答 1查看 120关注 0票数 0

我必须集成tetgen (网格生成器)的代码,这显然是经常使用的。然而,我不得不使用旧版本(1.4.3而不是1.5),这给了我一个“写访问冲突”。相关函数如下:

代码语言:javascript
复制
void tetgenmesh::dummyinit(int tetwords, int shwords)
{
  unsigned long alignptr;

  // Set up 'dummytet', the 'tetrahedron' that occupies "outer space".
  dummytetbase = (tetrahedron *) new char[tetwords * sizeof(tetrahedron)
                                          + tetrahedrons->alignbytes];
  // Align 'dummytet' on a 'tetrahedrons->alignbytes'-byte boundary.
  alignptr = (unsigned long) dummytetbase;
  dummytet = (tetrahedron *)
    (alignptr + (unsigned long) tetrahedrons->alignbytes
     - (alignptr % (unsigned long) tetrahedrons->alignbytes));
  // Initialize the four adjoining tetrahedra to be "outer space". These
  //   will eventually be changed by various bonding operations, but their
  //   values don't really matter, as long as they can legally be
  //   dereferenced.
  dummytet[0] = (tetrahedron) dummytet;
  dummytet[1] = (tetrahedron) dummytet;
  dummytet[2] = (tetrahedron) dummytet;
  dummytet[3] = (tetrahedron) dummytet;
...
...
...
}

‘'dummytetbase’和'dummytet‘都是双*指针,四面体是双**指针。

示例值为:

“‘tetwords”是: 12。

‘(无符号长四面体)->alignbytes’:8。

‘'tetwords*sizeof(四面体)+四面体->alignbytes’是: 104。

‘(alignptr% (unsigned Long)四面体->alignbytes)’是: 0。

代码编译得很好,但是当指针从'dummytet‘转换到'dummytet’时,我得到了这个‘写访问冲突’。

因此,dummytet获得dummytetbase + 8的地址。dummytetx也获得所有相同的地址,但这会导致写冲突。

知道为什么会这样吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-04-19 19:49:52

很简单:double***double**是完全不同的类型。double***指向double**,而double**指向double*。递归地应用此逻辑。

现在,由于两者都是指针,编译器将使用32位或64位。你可以告诉编译器闭嘴,抛开差异,在编译时忽略这个问题。这意味着您的编译时问题现在具有运行时症状。

后退一步:如果您有一个T* ptr并且需要一个T值,那么就不需要编写(T) ptr。你可以编写*ptr,或者ptr[5],或者类似的东西。当使用T==double**时,这种情况仍然有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43470536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档