【问题标题】:Dereference structure array items in C++C ++中的取消引用结构数组项
【发布时间】:2014-09-19 18:47:30
【问题描述】:

我在使用以下代码取消引用我的数组对象时遇到问题。 我想做的是将 *pstructDocuments 的数组元素复制到全局向量中。我知道全局变量不是最好的方法,但出于测试目的,我想用结构元素填充全局向量。

struct DOCUMENTS{
    wchar_t* TYPE;
    wchar_t* PATH;
}

std::vector<DOCUMENTS> CdeskDocumentsVec

void initDocuments(DOCUMENTS *pstructDocuments, int size){

  for (int i = 0; i < size; i++)
  {
     DOCUMENTS test1 = {};
     test1.PATH = pstructDocuments[i].PATH;
     test1.TYPE = pstructDocuments[i].TYPE;
     CdeskDocumentsVec.push_back(test1);
  }
}

我已经测试了一些复制功能,但它们没有按预期工作。所以我希望有人可以帮助我找到创建包含所有数组元素的全局副本的解决方案.....

这个

DOCUMENTS test1 = {};
test1.PATH = L"PATH_TEXT";
test1.TYPE = L"TYPE_TEXT";
CdeskDocumentsVec.push_back(test1);

适用于定义和给定的字符串。

这个

CdeskDocumentsVec.push_back(pstructDocuments[i]);

不起作用。我认为这与指针有关...

不工作意味着我无法遍历向量并访问存储在 pstructDocuments 数组中 DOCUMENT 结构中的字符串...

更新: 当我复制数据时

const size_t len = wcslen(pstructDocuments[i].PATH);
test1.PATH = new wchar_t[len + 1];
wcsncpy(test1.PATH, pstructDocuments[i].PATH, len + 1);

它似乎工作....

【问题讨论】:

  • 您需要更详细,而不仅仅是“没有按预期工作”。您的预期是什么,有何不同?
  • 我觉得你不需要test1,你可以用.push_back(pStructDocuments[i])
  • 我也想知道你为什么这样做。如果是我认为的那样,您是否考虑过 C++11 的新初始化语法,它允许您像数组一样初始化向量?也许不需要代码来做这个复制,这取决于你想要完成的事情。
  • 不知道究竟是什么不起作用,你只做数组的浅拷贝会不会是个问题?如果pstructDocuments 中的字符串在initDocuments 之后被释放,则CdeskDocumentsVec 中的指针无效。

标签: c++ arrays pointers vector copy


【解决方案1】:

从 pstructDocuments[i] 复制字符串而不是分配它们。当您分配它们时,您将指针存储到原始字符串而不是副本。如果原始字符串被破坏,你就有问题了。

【讨论】:

  • 感谢您的反馈。我认为这正是问题所在。背景是我将从外部程序调用 initDocuments 函数,该函数提供第一个数组的指针和所属的元素/字符串。我猜这些指针在全局范围内不可用......因此我将尝试复制 wchar 值。我已经尝试过 strcpy ,它也不起作用。实现这一目标的最佳方法是什么?
  • @Jochen std::wstring 是要走的路。更改TYPEPATH,其他代码保持不变。
  • 我不确定从 wchar_t 更改为 wstring 是否是一种选择,因为我将使用结构“extern”...
猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 2010-09-15
  • 2013-11-05
  • 2023-04-02
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多