c /Append/Delete basic 中的数组函数

array function in c /Append/Delete basic

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

int* create_int_array(){
   int* arr;
   arr = (int *)calloc(1,sizeof(int));
   return arr;
}


char** create_string_array(){
   char** arr = calloc(1,sizeof(char));
   return arr;
}

void append_int(int* array, int element, int index){
  array = (array+index);
  *array = element;
}

void append_string(char** array , char* element,int index){
  *(array + index) = calloc(1,sizeof(char*));
  strcpy(*(array + index),element);
}

void delete_string(char** array, int index){
  free(array[index]);
}

void delete_int(int* array,int index){
  array[index] = NULL;
}

/////// M A I N   F I L E ///////

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "basic_data_file.h"

int main(int argc, char const *argv[])
{
  /* code */
  char **array;
  array = create_string_array();

  char *full_name = calloc(strlen("hamza arslan"),sizeof(char*));
  strcpy(full_name,"hamza arslan");

  char* mail = calloc(strlen("test@gmail.com"),sizeof(char*));
  strcpy(mail,"test@gmail.com");

  char* address = calloc(strlen("Hacettepe Universty"),sizeof(char*));
  strcpy(address,"Hacettepe Universty");

  char* statu = calloc(strlen("student"),sizeof(char*));
  strcpy(statu,"student");

  append_string(array,full_name,0);
  append_string(array,mail,1);
  append_string(array,address,2);
  append_string(array,statu,4);

  for(int i=0; i< 3; i++){
    printf("%s\n",array[i]);
    free(array[i]); // get free double pointer
  }
  printf("%s\n",array[4]); // because index 3 blow up

  free(full_name);
  free(mail);
  free(address);
  free(statu);
  return 0;
}

我试图拥有我的基本数组库。如您所知,在某些语言中还有高级数组类型。他们使我们的库存操作变得容易。但在 c 中,它更复杂,尤其是关于字符串。我在这里有 2 个问题。首先,当我在 append_string 函数中给出 index=3 时,代码因 Aborted(core dumped) 错误而爆炸。(./运行': double free or corruption (out))。其次,当我检查内存泄漏时,即使我使用 free 也会发生内存泄漏。我能做什么?

会有几次崩溃,但这里有一次:

   char** arr = calloc(1,sizeof(char));

您分配的 1 个字节不足以存储 (char *),它需要 2 到 8 个字节,具体取决于 OS 和目标机器。

试试这个:

   char** arr = calloc(1,sizeof(char*));

您应该仔细检查每一行代码。 C 不是一种宽容的语言 - 错误会受到严厉的惩罚。

您的 create_xy_array 函数分配一个包含 1 个元素的数组,并且它们一直保持这种状态直到最后。当你有一个单元素数组和索引时,read/write 它的第二个和更多元素,C 本身很高兴地批准,但结果不起作用,它默默地破坏了它路径中的一切。

首先,要有一个动态数组,你得自己跟踪它的长度,Callocations/arrays不知道自己的大小。所以你需要一个包含长度和指针的结构,比如

typedef struct IntArray {
  int length;
  int *elements;
} IntArray;

然后分配它,对于0个元素,因为开头里面什么都没有:

IntArray* create_int_array() {
  IntArray* ret = (IntArray*) malloc(sizeof(IntArray));
  ret->length = 0;
  ret->elements = NULL;
  return ret;
}

void free_int_array(IntArray* arr) {
  free(arr->elements);
  free(arr);
}

那你可以试试在里面放点东西:

void append_int(IntArray* arr, int element) {
  arr->length++;
  arr->elements = (int*) realloc(arr->elements, arr->length*sizeof(int));
  arr->elements[length-1] = element;
}

(appending就是在数组末尾添加一些东西,这里不需要索引)

这可能会永远持续下去,删除任意元素应该移动数组的 "upper" 部分 (memcpy) 并将结果调整为更小的一个元素,或者您可以跟踪数组的容量,它可以大于它的当前长度(但是它必须被合并到附加函数和其他函数中)。

(免责声明:我希望该片段是正确的,但我不经常使用 C - 出于同样的原因我不能推荐一个好的教程,但这可能是你需要的)

注意:我已经很多年没有用 C 编写代码了,我也没有检查过代码,所以请仔细检查并告诉我。

根据您的描述,您正在尝试做一个 Vector。

因此,您可以通过不同的方式处理此问题。

方法一:

创建一个结构来保存数组、数组的容量和数组的大小。

typedef struct StrArray{
    int capacity;
    int size;
    int *integers;
}

这里的诀窍是当你increase/decrease容量时要注意。

如果将容量增加到数组大小以上,则:

  • 您需要创建一个容量翻倍的新阵列
  • 将所有元素复制到新数组
  • 更改指向新数组的指针
  • 释放旧数组的内存

方法二

您可以通过创建一个函数来扩展以前的方法,该函数 returns 一个包含存储的结构以及指向您希望实现的方法的函数指针。

typedef struct StrStorage{
    int capacity;
    int size;
    int *integers;
} StrStorage;

typedef struct StrArray {
    StrStorage storage;
    int (*capacity)(StrArray*);
    int (*size)(StrArray*);
    StrArray *(*append)(StrArray*, int);
    void (*increaseStorage)(StrArray*);
    // Add other methods here
} StrArray;

int capacity(StrArray *self) {
    return self->storage->capacity;
}

int size(StrArray *self) {
    return self->storage->size;
}

StrArray *append(StrArray *self, int integer){
    if ((self->capacity() + 1) > self->size()){
        self->increaseStorage();
    }
    // The rest of the magic goes here
    return self;
}

StrArray *initializeStrArray(int n) {
    StrArray* strArray = malloc(sizeof(StrArray));
    strArray->chars = malloc(sizeof(char) * n);
    strArray->capacity= capacity;
    strArray->append = append;
    return strArray;
}

方法三:

这种方法是前一种方法的延续。

为了减少内存分配,你可以创建一个等同于一个拥有所有操作函数的单例,然后assi