如何复制结构指针
How to copy a struct pointer
我有两个功能:
Func.h
struct Ex
{
int a;
int b;
}
Func.cpp
void Copy(Ex ** ex1, Ex *ex2)
{
//
}
void Init(Ex **ex)
{
*ex = (Ex*)malloc(3*sizeof(Ex));
Ex *ex2 = (Ex*)malloc(sizeof(Ex));
Copy(&(*ex+1), ex2) //error here
}
谁能告诉我如何解决这个错误?
谢谢!!!
您遇到的困难是因为您没有在 Init
函数中创建 3 个指向 struct Ex
类型的指针。您只是创建了一个指针,指向 一个足够容纳 3 个结构 Ex 的内存块。这很好,但是您不能依赖普通的数组语法来传递或访问 ex
中的值。 您 负责提供指向您在 ex
中想要的任何值的指针地址。
以下是您的代码的一个简单示例。 Init
已更改为采用 数字结构的附加参数来为 创建大小,以及 成员 a
和 [= 的初始值18=].
就我个人而言,我发现在 main
中将原始结构创建为 struct Ex **ex
并将地址作为三重指针传递给 Init
更容易,但这取决于您.按照您的方法,请查看以下内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Ex
{
int a;
int b;
};
/* simple copy funciton */
void Copy(struct Ex *ex1, struct Ex *ex2)
{
memcpy (ex1, ex2, sizeof (struct Ex));
}
/* arguments, address of *ex, num to create, initial values .a=va, .b=vb */
void Init(struct Ex **ex, size_t n, int va, int vb)
{
size_t i = 0;
size_t offset = sizeof **ex;
*ex = malloc (n * offset);
struct Ex *ex2 = malloc (sizeof *ex2);
ex2-> a = va;
ex2-> b = vb;
for (i = 0; i < n; i++)
Copy (*ex + i * offset, ex2);
}
int main (void) {
struct Ex *ex = NULL;
size_t offset = sizeof *ex;
size_t i = 0;
Init (&ex, 3, 5, 6); /* initialize 3 ex, with initial values of 5, 6 */
for (i = 0; i < 3; i++)
printf ("\n (ex +%2lu)->a : %d\n (ex +%2lu)->b : %d\n",
i * offset, (ex + i * offset)->a, i * offset, (ex + i * offset)->b);
return 0;
}
输出
$ ./bin/structinitcopy
(ex + 0)->a : 5
(ex + 0)->b : 6
(ex + 8)->a : 5
(ex + 8)->b : 6
(ex +16)->a : 5
(ex +16)->b : 6
我有两个功能:
Func.h
struct Ex
{
int a;
int b;
}
Func.cpp
void Copy(Ex ** ex1, Ex *ex2)
{
//
}
void Init(Ex **ex)
{
*ex = (Ex*)malloc(3*sizeof(Ex));
Ex *ex2 = (Ex*)malloc(sizeof(Ex));
Copy(&(*ex+1), ex2) //error here
}
谁能告诉我如何解决这个错误?
谢谢!!!
您遇到的困难是因为您没有在 Init
函数中创建 3 个指向 struct Ex
类型的指针。您只是创建了一个指针,指向 一个足够容纳 3 个结构 Ex 的内存块。这很好,但是您不能依赖普通的数组语法来传递或访问 ex
中的值。 您 负责提供指向您在 ex
中想要的任何值的指针地址。
以下是您的代码的一个简单示例。 Init
已更改为采用 数字结构的附加参数来为 创建大小,以及 成员 a
和 [= 的初始值18=].
就我个人而言,我发现在 main
中将原始结构创建为 struct Ex **ex
并将地址作为三重指针传递给 Init
更容易,但这取决于您.按照您的方法,请查看以下内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Ex
{
int a;
int b;
};
/* simple copy funciton */
void Copy(struct Ex *ex1, struct Ex *ex2)
{
memcpy (ex1, ex2, sizeof (struct Ex));
}
/* arguments, address of *ex, num to create, initial values .a=va, .b=vb */
void Init(struct Ex **ex, size_t n, int va, int vb)
{
size_t i = 0;
size_t offset = sizeof **ex;
*ex = malloc (n * offset);
struct Ex *ex2 = malloc (sizeof *ex2);
ex2-> a = va;
ex2-> b = vb;
for (i = 0; i < n; i++)
Copy (*ex + i * offset, ex2);
}
int main (void) {
struct Ex *ex = NULL;
size_t offset = sizeof *ex;
size_t i = 0;
Init (&ex, 3, 5, 6); /* initialize 3 ex, with initial values of 5, 6 */
for (i = 0; i < 3; i++)
printf ("\n (ex +%2lu)->a : %d\n (ex +%2lu)->b : %d\n",
i * offset, (ex + i * offset)->a, i * offset, (ex + i * offset)->b);
return 0;
}
输出
$ ./bin/structinitcopy
(ex + 0)->a : 5
(ex + 0)->b : 6
(ex + 8)->a : 5
(ex + 8)->b : 6
(ex +16)->a : 5
(ex +16)->b : 6