【问题标题】:Copying Struct to a Pointer array in a function C将结构复制到函数C中的指针数组
【发布时间】:2015-10-15 12:10:11
【问题描述】:

我在 C 中分配内存时遇到了很大的问题

我有这个结构

typedef struct{
int x;
int y;
}T;

我想创建一个将结构动态添加到指针的函数。 类似:

int main()
{
 T* t;
 f(&t);
 free(t);
}

到目前为止,我认为一切正常,现在功能是我迷路的地方

void f(T** t)
{
 T t1;
 T t2;
 T t3;
 //first i malloc
 *t=malloc(sizeof(T)*T_MAX_SIZE);//i want another function to make the array bigger, but this is not as important as the problem
 t1.x=11;
 t1.y=12;
 t2.x=21;
 t2.y=22;
 t3.x=31;
 t3.y=32;
//now i want to copy the values from t1,t2,t3 to t[0],t[1],t[2]
 memcpy(&(*t[0]),&t1,sizeof(T));
 memcpy(&(*t[1]),&t2,sizeof(T));
 memcpy(&(*t[2]),&t3,sizeof(T));


}

我不知道复制这些结构的正确方法。

这样做的目的是在函数之外使用 t (主要)

非常感谢:D

【问题讨论】:

  • 我正在删除 C++ 标签,因为它在这里无关紧要。
  • 很抱歉,谢谢
  • @juanchopanza 已更改为相关标签,谢谢 :)
  • 试试(*t)[0] = t1;(*t)[1] = t2;(*t)[2] = t3;

标签: c pointers struct dynamic-memory-allocation


【解决方案1】:

您不需要任何复制功能来将一个结构分配给另一个结构 - 您只需将它们等同起来。所以如果你有

T var1 = {1, 2};
T var2 = var1;

整个var1 被复制到var2。修改您的(简化的)程序:

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

#define T_MAX_SIZE 10

typedef struct{
    int x;
    int y;
}T;

void f(T** t)
{
    T t1;
    *t=malloc(sizeof(T)*T_MAX_SIZE);
    t1.x=11;
    t1.y=12;
    (*t)[0] = t1;
}

int main(void) {
    T* t;
    f(&t);
    printf ("Result %d %d\n", t[0].x, t[0].y);
    free(t);
    return 0;
}

程序输出:

Result 11 12

【讨论】:

  • 这解决了我的问题,也是一个有效的解决方案,非常感谢;D
  • 是否可以移动指针而不是移动到该位置?
  • @LuisDanielRubiera,我认为您应该尝试一下,如果遇到问题,请发布一个新问题。不要害怕“破坏”程序:操作系统和硬件经过精心设计,可以保护计算机免受意外损坏。但请注意,如果您移动指针,您将无法free 内存。使用指针的副本。
  • 非常感谢您提供的信息,是否有任何指南知道如何在我移动指针后释放指针?或者如何正确使用它的副本?
  • 使用副本,然后您可以free 原始值。只要确保您不会丢失原始指针值,如果您尝试 free(changedpointer) 那就不好了!
【解决方案2】:

您的memcpy 呼叫不正确。

在表达式&amp;(*t[0]) 中,数组索引具有最高优先级,然后是指针间接寻址。因此,使用显式括号,它看起来像&amp;(*(t[0]))

所以它首先尝试数组下标t,也就是main中t的地址。在t[0] 的情况下,它仍然有效,但t[1] 引用了超出该变量的内容,调用了未定义的行为。您想要t 指向的数组索引,即(*t)[i]

所以 memcpy 调用应该是:

memcpy(&((*t)[0]),&t1,sizeof(T));
memcpy(&((*t)[1]),&t2,sizeof(T));
memcpy(&((*t)[2]),&t3,sizeof(T));

【讨论】:

  • 非常感谢它成功了,你能解释一下为什么它有效吗? &((*t)[0] ,表示指针t在0-1-2位置的内存值?
  • 可以移动指针吗? ,类似 memcpy(&((*t)+1)...;?
  • 那不行,因为*t + 1 不是左值,所以你不能取它的地址。但你可以做memcpy(*t+1,&amp;t1,sizeof(T));
猜你喜欢
  • 1970-01-01
  • 2020-05-09
  • 2018-04-21
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
相关资源
最近更新 更多