首页 > 解决方案 > 使用 memmove 函数复制数组的数据

问题描述

我为整数类型编写了向量(动态增长数组)的实现。memmove在使用和 memcpy 函数实现数据重新分配目标时,我遇到了一个问题。Memmmove 和 memcpy 函数按预期工作。所以我用它替换了它, for 现在它可以正常工作了。但是 memove 以这种方式工作的原因是什么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct vector {
    int  v_size;
    int  v_length;
    int* v_data;
} vector;
 
 
typedef vector *vect;
 
vect
new_vector(int size) {
  
 vect tmp  = (vector*)malloc(sizeof(vector));
 tmp->v_size = size;
 tmp->v_length = 0;
 tmp->v_data = (int*)malloc(sizeof(int) * size);
 return tmp;  
 
}
 
void
add_velem(vect tmp, int elem) {
    if(tmp->v_length != tmp->v_size) {
      
      tmp->v_data[tmp->v_length] = elem;
      tmp->v_length += 1;
      
    } else {    
      
      tmp->v_size = tmp->v_size * 2;
      tmp->v_length += 1;
      int *new_vector = (int*)malloc(sizeof(int) * tmp->v_size);
     
      memmove(new_vector, tmp->v_data, tmp->v_length); // GOT INPUT LIKE THIS:
      // 500, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
      // ALOT OF ZERO
      /*
      for(int i = 0; i < tmp->v_length; i++) {
          new_vector[i] = tmp->v_data[i];
      }*/ // BUT GOT RIGHT INPUT WHEN USING FOR. WHAT IS THE REASON?
      free(tmp->v_data);
      tmp->v_data = new_vector;
      tmp->v_data[tmp->v_length - 1] = elem;
   
    } 
    
    return;  
}
 
int
get_vlength(vect tmp) {
    return tmp->v_length;
} 
 
int
get_vsize(vect tmp) {
    return tmp->v_size;
}
 
int
get_velem(vect tmp, int elem) {
    if(tmp->v_data == NULL) {
       fprintf(stderr, "Index out of range!\n");
        
    }else if(elem >= tmp->v_length) {
       fprintf(stderr, "Index is out of range!\n");
       return -1;    
    }  
    
    return tmp->v_data[elem];
  
}

void
delete_vector(vect tmp) {
    free(tmp->v_data);
    tmp->v_data = NULL;
    free(tmp);
    tmp = NULL;
}


int 
main(void) {
    
    vect example = new_vector(10);
    printf("lenth of vector is %d\n", get_vlength(example));
    add_velem(example, 500);
    printf("element %d is pushed into vector\n", 500);
    printf("size of vector is %d and\nlength of vector is %d\n", get_vsize(example), get_vlength(example));
    
    int velem = get_velem(example, 0);
    
    printf("elem 0 of vector is %d\n", velem);
    
    for(int i = 1; i < 30; i++) {
        add_velem(example, i);
    }
    
    printf("length of vector is %d now\n", get_vlength(example));
 
    for(int i = 0; i < get_vlength(example); i++) {
       printf("%d, ", get_velem(example, i));
   }
 
    delete_vector(example);
 
    return 0;
}


标签: c

解决方案


推荐阅读