我正在研究一組允許動態增長用戶定義陣列的 C 函式。在此站點上的一些人的幫助下,我已經能夠開發充當陣列初始化的函式,以及另一個可以將標量附加到陣列或將陣列附加到陣列的函式。我正在使用一個名為的結構Array,它充當陣列的容器、陣列array的活動長度、陣列len的總分配大小size以及每個索引的記憶體elem。
第一個函式initialize_array分配記憶體并初始化陣列,該函式init_array是一個包裝器,用于initialize_array預先格式化一些資訊并回傳一個Array資料型別。最后,我有一個函式append_array,它可以采用標量或陣列,并且可以使用強制轉換為 a 的方法將陣列附加到Array結構中以協助指標算術。我正在嘗試使用一個函式重新創建該函式,該函式將添加在第一個索引中傳入的標量或陣列并將其他索引推到左側。我對如何做到這一點有點迷茫,任何建議都會有所幫助。memcpcharappend_arrayprepend_array*items
陣列.h
#ifndef ARRAY_H
#define ARRAY_H
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct
{
void *array; // Container for array
size_t len; // Active length of array
size_t size; // Size of allocated memory
int elem; // Memory consumption per element
} Array;
void initiate_array(Array *array, size_t num_indices);
Array init_array(int size, size_t num_indices);
int append_array(Array *array, void *items, size_t count);
int prepend_array(Array *array, void *items, size_t count);
#endif /* ARRAY_H */
陣列.c
#include "array.h"
void initiate_array(Array *array, size_t num_indices) {
void *pointer;
pointer = malloc(num_indices * array->elem);
if (pointer == NULL) {
printf("Unable to allocate memory, exiting.\n");
free(pointer);
exit(0);
}
else {
array->array = pointer;
array->len = 0;
array->size = num_indices;
}
}
Array init_array(int size, size_t num_indices) {
Array array;
array.elem = size;
initiate_array(&array, num_indices);
return array;
}
int append_array(Array *array, void *items, size_t count) {
if (array->len count > array->size) {
size_t size = (array->len count) * 2;
void *pointer = realloc(array->array, size * array->elem);
if (pointer == NULL) {
return 0;
}
array->array = pointer;
array->size = size;
}
memcpy((char *)array->array array->len * array->elem, items, count * array->elem);
array->len = count;
return 1;
}
int prepend_array(Array *array, void *items, size_t count) {
if (array->len count > array->size) {
size_t size = (array->len count) * 2;
void *pointer = realloc(array->array, size * array->elem);
if (pointer == NULL) {
return 0;
}
array->array = pointer;
array->size = size;
}
// Not sure how to handle this with memcp like was used for append_array
array->len = count;
return 1;
}
主程式
#include <stdio.h>
#include <stdlib.h>
#include "array.h"
int main(int argc, char** argv)
{
int i, j;
float ii = 0.0;
size_t indices = 20;
Array float_test = init_array(sizeof(float), indices);
Array int_test = init_array(sizeof(int), indices);
// Populate both arrays
for (i = 0; i < 30; i ) {
ii = 1.1;
append_array(&int_test, &i, 1);
append_array(&float_test, &ii, 1);
}
int a[3] = {10, 9, 8};
prepend_array(&int_test, a, 3);
// Print int array values
for (i = 0; i < int_test.len; i )
{
printf("Value: %d Size:%zu \n",((int *) int_test.array)[i], int_test.len);
}
return (EXIT_SUCCESS);
}
uj5u.com熱心網友回復:
要將元素添加到陣列中,在分配額外記憶體后,您首先需要移動現有元素。
當目標和源記憶體有可能重疊時,我們使用1memmove來安全地移動我們的資料。
移動現有元素后,我們將新元素復制到位。
可視化:
A is [11, 22, 33, 44, 55]
V is [99, 88, 77]
resize(A): [11, 22, 33, 44, 55, __, __, __]
move(A 3, A): [__, __, __, 11, 22, 33, 44, 55]
copy(A, V): [99, 88, 77, 11, 22, 33, 44, 55]
根據您的代碼,這看起來像:
memmove(
((char *) array->array) count * array->elem,
array->array,
array->len * array->elem);
memcpy(array->array, items, count * array->elem);
1.使用memcpy復制到和從重疊的記憶體是未定義的行為,并且是許多錯誤的來源。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/454850.html
下一篇:C 代碼在驗證后不斷崩潰
