如何使用动态allocate-struct的memcpy()函数

时间:2016-05-26 09:20:14

标签: c struct

我有一个结构

typedef struct process {
    int pid;
    int burst_t;
    int io_t;
    int pri;
    int arrive;
    int wait;
    int turnaround;
    int work;
    int remain;
} process;

和功能

void move_process(process* dest, int  *size_dest, process* src, int *size_src)
{
    memcpy(dest + (sizeof(process))*(*size_dest), src, sizeof(process));
    (*size_dest)++;
    (*size_src)--;
    printf("%d\n", sizeof(process));
    memmove(src, src + sizeof(process), sizeof(process)*(*size_src));   
}

ready = (process*)malloc(sizeof(process)*numberOfProcess);
remain = (process*)malloc(sizeof(process)*numberOfProcess);
move_process(ready, &s_ready, remain, &s_remain);

在函数move_process()的最后一行

我想删除进程* src中的第一个进程 但它不起作用。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

  • 您应该在源指针上使用const,以明确它是只读的。
  • 您不应该转换malloc()
  • 的返回值
  • 最好使用sizeof *dest来锁定"它是实际指针,不重复类型名称。
  • 尺寸和数组索引更好地表示为size_t,而不是int。在这种情况下,请务必使用%zu进行打印。
  • 请记住,可以分配结构,不需要对结构值使用memcpy。副本可以写成:dest[*size_dest] = src[*size_src];,不需要函数调用。
  • 请记住,指针算术以字节为单位完成。

答案 1 :(得分:-1)

dest + (sizeof(process))*(*size_dest)替换为dest + *size_dest以转发size_dest个地点。同样适用于memmove。

这应该可以解决问题。

void move_process(process* dest, int  *size_dest, process* src, int *size_src)
{
  memcpy(dest + *size_dest), src, sizeof(process))
  (*size_dest)++;
  (*size_src)--;
  printf("%d\n", sizeof(process));
  memmove(src, src + 1, sizeof(process)*(*size_src));
}