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