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
#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