2016-05-26 42 views
-1

我有一个结构如何使用memcpy()函数动态分配,结构

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 但它不起作用。

我该怎么办?

+0

的'memcpy'和'memmove'参数是可疑 –

+0

'的memcpy(DEST + * size_dest,SRC的sizeof(过程));'...,为的memmove(类似) – joop

+1

也许你不知道'src + 1'表示指向下一个'process'对象(不要增加1个字节) –

回答

1

有一些问题与您的代码:

  • 您应该使用const在源指针,使之清楚,它是只读的。
  • 您不应该输入malloc()的返回值。
  • 最好使用sizeof *dest将其“锁定”为实际指针,而不是重复类型名称。
  • 尺寸和阵列指数最好表示为size_t,而不是int。请记住在这种情况下使用%zu进行打印。
  • 请记住,可以分配结构,不需要使用memcpy作为结构值。副本可以写成:dest[*size_dest] = src[*size_src];,不需要函数调用。
  • 请记住,指针算术是而不是以字节为单位完成的。
-1

dest + (sizeof(process))*(*size_dest)替换为dest + *size_destsize_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)); 
}