将全局数组复制到由双指针引用的数组中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将全局数组复制到由双指针引用的数组中相关的知识,希望对你有一定的参考价值。

我在一个文件中有一个函数,它接受一个指向由双指针表示的数组的指针。我想将文件中的全局数组的内容复制到它。但是当我转储数组时,数据不正确。我究竟做错了什么?

注意:我有malloc足够的内存用于指向数组的双指针,并使用其地址将其传递给函数

File1:

struct Data DataArray[10];    //global structure

CopyGlobalArray (void ***ArrayBuffer)
{
    memcpy(*ArrayBuffer, &DataArray[0], sizeof(DataArray);
}


File2:

function() {
   Data **MyArray = malloc(sizeof(Data) * 10);
   CopyGlobalArray(&MyArray);

   for (index =0; index<10 ; index++){
     printf(MyArray[Index]->FirstName);
     printf(MyArray[Index]->LastName);
   }
}
答案

可能很难想象,所以让我们绘制关系:

malloc函数返回一个指针:

+-------------------+     +----------------------+
| pointer to memory | --> | The actual memory... |
+-------------------+     +----------------------+

但是,你将MyArray声明为指向指针(do struct Data),这更像是

+---------+     +-------------------+     +----------------------+
| MyArray | --> | pointer to memory | --> | The actual memory... |
+---------+     +-------------------+     +----------------------+

问题是MyArray并没有真正指向指针,它直接指向实际内存,这意味着代码将不正确。

另一答案

只要复制功能不为复制分配内存,单个指针就足够了:

struct Data DataArray[10];    //global structure

CopyGlobalArray (void *ArrayBuffer)
{
     memcpy(ArrayBuffer, DataArray, sizeof(DataArray));
}

如果函数是为复制分配内存,你需要一个双指针或使用返回值,后者是首选:

struct Data DataArray[10];    //global structure

void *CopyGlobalArray (void)
{
     void *copy;
     if (copy=malloc(sizeof(DataArray)))
         memcpy(copy, DataArray, sizeof(DataArray));
     return copy;
}
另一答案

你为什么要将双指针传递给void *。你可以通过一个void *来做到这一点。你可以这样做:

 File1:

struct Data DataArray[10];    //global structure

CopyGlobalArray (void *ArrayBuffer)
{
     memcpy(ArrayBuffer, DataArray, sizeof(DataArray);
}


File2:

function() {
    Data *MyArray = malloc(sizeof(Data) * 10);
    CopyGlobalArray(MyArray);
}
另一答案

在你声明MyArray作为双指针

  Data **MyArray = malloc(sizeof(Data) * 10);

malloc的结果应该被转换为双指针:

 struct Data **MyArray = (struct Data**) malloc(sizeof(Data) * 10);

但是提供一个指向struct Data数组的单个指针应该足以满足您的需求:

void CopyGlobalArray (void *ArrayBuffer)
{
     memcpy(ArrayBuffer, DataArray, sizeof(DataArray));
}

这是你如何使用它:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Data
{
    char * FirstName;
    char * LastName;
};

// global structure
struct Data DataArray[] = {  {.FirstName = "Fred",  .LastName= "Smith"}, {.FirstName = "Eva",  .LastName= "White"}, {.FirstName = "John",  .LastName= "Rock"} }; 

void CopyGlobalArray (void *ArrayBuffer)
{
     memcpy(ArrayBuffer, DataArray, sizeof(DataArray));
}

void print(struct Data *array )
{
    for(size_t i=0; i < sizeof(DataArray)/sizeof(DataArray[0]); i++)
    {
      printf("%s",  array[i].FirstName);
      printf("%s
", array[i].LastName);
    }
}

struct Data *function()
{
   struct Data *MyArray = (struct Data *) (malloc (sizeof(DataArray) ) );

    CopyGlobalArray (MyArray);

    // Copied array
    printf("
MyArray:
");
    print(MyArray);

   return MyArray; 
}

int main(void)
{
     // Original 
    printf("
DataArray:
");
    print(DataArray);

    struct Data *MyArray1 = function();

    printf("
MyArray1:
");
    print(MyArray1);   

    free(MyArray1); // free the array allocated inside function()
    return 0;
}

输出:

DataArray:
FredSmith
EvaWhite
JohnRock

MyArray:
FredSmith
EvaWhite
JohnRock

MyArray1:
FredSmith
EvaWhite
JohnRock

以上是关于将全局数组复制到由双指针引用的数组中的主要内容,如果未能解决你的问题,请参考以下文章

C/c++中 数组全局变量的定义声明 与 引用声明

(C/C++)区别:数组与指针,指针与引用

当指针指向数组时,为啥 operator(*) 的值不起作用?

不能将数组运算符用于基于数组的指针(读取访问冲突)

C语言数组是“引用类型”么?

多维数组如何存储在内存中? [复制]