范例1:
#include <stdio.h>
#include <string.h>
void saveData(void* data) // only allow to use void* data
{
// ...After some calculation:
int inputData[5] = {1,2,3,4,5};
memcpy((int*)data, inputData, sizeof(inputData));
}
int main()
{
int myNum[256];
saveData((void*)myNum);
printf("\n%d%d%d%d%d\n",myNum[0],myNum[1],myNum[2],myNum[3],myNum[4]);
}
我在main中有一个int数组,并将该数组传递给函数saveData,
在函数savaData中,我将inputData [5]保存到myNum [256]中;
它工作正常。
范例2:
如果我有一个struct数组而不是int数组怎么办:
#include <stdio.h>
#include <string.h>
struct Analysis{
int a;
int b[10];
};
void saveData(void* data, size_t size) // update here for size param
{
struct Analysis a1;
a1.a = 1;
memset(a1.b, 0, 10*sizeof(int));
for(int i=0; i<10; i++)
{
a1.b[i] = 1;
printf("%d", a1.b[i]);
}
struct Analysis a2;
a2.a = 2;
memset(a2.b, 0, 10*sizeof(int));
for(int i=0; i<10; i++)
{
a2.b[i] = 2;
printf("%d", a2.b[i]);
}
//memcpy((int*)data, inputData, sizeof(inputData));
//How can I copy a1 and a2 into memory space of data(ana[2]) here;
}
int main()
{
struct Analysis ana[2];
saveData((void*)ana, sizeof ana[0]); // update here
for(int i=0; i<2; i++)
{
printf("\n%d\n", ana[i].a);
for(int j=0; j<10; j++)
printf("%d", ana[i].b[j]);
}
}
那么,如何在函数saveData中将a1和a2复制到ana [2]的内存中?
我认为是:
我可以将数据(ana)转换为char *以遍历其地址并存储结果;
完成ana [0]后,可以使用sizeof(ana [0])将指针前进到下一个
一个(ana [1])。
****更新:-------------------------------------------- ------------------------
size-这是用于保存每个文件结果的结构的大小。传递此信息很重要。没有该大小,您将无法正确访问已传递给映射的阵列的插槽。由于result是一个空指针,为了支持多种类型的数组,常规指针算法将无法正常工作,因此大小在这里至关重要。
最佳答案
那么,如何在函数saveData中将a1和a2复制到ana [2]的内存中?
有很多方法。一种是您演示使用int
做到这一点的方式的精确模拟:
void saveData(void* data)
{
// ...After some calculation:
struct Analysis aa[2] = {
{ 1, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } },
{ 2, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }
};
// note: no need to cast 'data' or 'aa' as long as a prototype is visible
memcpy(data, aa, sizeof(aa));
}
当然,所有这些都引出了一个问题,即当您的代码对其引用对象的类型以及包含数组的容量(和存在)进行关键假设时,为什么要将
saveData()
的参数声明为类型void *
。感觉您太过普通了。我认为是:
我可以将数据(ana)转换为char *以通过其地址存储
结果;
一旦完成ana [0],就可以使用sizeof(ana [0])前进指针
到下一个(ana [1])。
是的,您可以这样做,但是为什么呢?如果要转换指针的类型,则将其转换为要写入的数据的类型(例如
struct Analysis *
),并像数组一样使用它。 (还要注意,赋值运算符适用于struct
和union
。):void saveData(void* data)
{
// ...After some calculation:
struct Analysis aa[2] = {
{ 1, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } },
{ 2, { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }
};
struct Analysis *data_array = data;
for (int i = 0; i < 2; i++) {
data_array[i] = aa[i];
}
}
这几乎等于您所描述的内容,但更加清晰。
关于c - 如何通过在C中推进内存地址来存储结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39419832/