C++ 使用aligned_malloc和memcpy将struct复制到指针多次

C++ 使用aligned_malloc和memcpy将struct复制到指针多次,c++,pointers,struct,C++,Pointers,Struct,我正在尝试将一个struct对象复制到一个指针变量,在该变量中,我使用_aligned_malloc分配了内存,我只想复制该struct一次以上。如果我复制它一次,它就工作了,否则它就不工作了。以下是代码片段: dev_probConfig = (ProbConfig*)_aligned_malloc(N* sizeof(ProbConfig),64); for (int i = 0; i < N; ++i) { memcpy(dev_probConfig + i * sizeo

我正在尝试将一个struct对象复制到一个指针变量,在该变量中,我使用_aligned_malloc分配了内存,我只想复制该struct一次以上。如果我复制它一次,它就工作了,否则它就不工作了。以下是代码片段:

dev_probConfig = (ProbConfig*)_aligned_malloc(N* sizeof(ProbConfig),64);
for (int i = 0; i < N; ++i) 
{
    memcpy(dev_probConfig + i * sizeof(ProbConfig), h_probConfig, sizeof(ProbConfig));
}
dev_probConfig=(probConfig*)_aligned_malloc(N*sizeof(probConfig),64);
对于(int i=0;i
我做错了什么?! 我的结构不包含填充,其大小为512字节。
谢谢。

这是C语言中指针运算的一个棘手方面。向指向T的指针中添加1会使其递增
sizeof(T)
,而不是递增1。因此,您应该删除
*sizeof(ProbConfig)
,以实现您想要的功能

假设这实际上是C,那么最好将其写成:

dev_probConfig = _aligned_malloc(N * sizeof(ProbConfig), 64);
for (size_t i = 0; i < N; i++)
    memcpy(&dev_probConfig[i], h_probConfig, sizeof(ProbConfig));
&dev_probConfig[i]
dev_probConfig+i
相同,但更清晰,正是因为指针算法的这种诡计


另外,不要在C中强制转换类似于
malloc
的函数的结果。这是不必要的,而且它可以隐藏错误:例如,如果您忘记在使用
malloc
的程序中包含
stdlib.h
,那么传统的“隐式声明”规则开始生效,
malloc
被视为返回一个
int
而不是
void*
。如果
int
void*
大小不同(例如,因为
int
宽32位,但指针宽64位)这将以某种方式损坏指针,直到您的程序必须处理比平时更多的数据时才会注意到。您将从编译器中得到一个警告-但只有在您不强制转换返回值的情况下


<>(在C++中,你必须把<代码> MalOC/-Acess之类的函数转换成结果,但是在C++中,你应该使用<代码> STD::vector < /代码>。你可以用A来获得一个<代码> STD::向量额外的数组对齐;这看起来很复杂,但它实际上只是很多样板。< /P> C和C++是不同的语言,代码应分别写在不同的地方。请删除不相关的标签。还有什么是
\u aligned\u malloc
?它不是一个标准函数。它可能是应用程序代码中不允许使用的内部符号。提供一个。“我的代码不工作”不是有效的问题描述。我鼓励你把它写成
memcpy(&dev_probConfig[I],h_probConfig,sizeof(probConfig))。这更清晰,并保证正确处理指针算法。我假设您已经将
h_probConfig
声明为指针?不,我的意思是,直接分配结构而不是用
memcpy()
@mfro()优化编译器的结构分配有什么错?我只想改变真正需要改变的东西。确实,您的版本要简单得多,但是OP有
memcpy
,这样做没有错。“另外,不要在C中使用类似malloc的函数的结果。这实际上会隐藏严重的错误。”为什么?@geza Short version:如果您忘记包含
,在C语言中,仍然允许调用
malloc
,但编译器将其视为具有返回类型
int
(“隐式声明”),而不是
void*
,并且(取决于ABI),这可能会导致它损坏返回的指针。对于大多数现代编译器,发生这种情况时会收到警告,但前提是不强制转换返回值。
dev_probConfig = _aligned_malloc(N * sizeof(ProbConfig), 64);
for (size_t i = 0; i < N; i++)
    dev_probConfig[i] = h_probConfig;