范例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 *),并像数组一样使用它。 (还要注意,赋值运算符适用于structunion。):

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/

10-11 18:10