Это мой код:Есть ли способ выполнить функцию additem без изменения значений двух указателей?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
unsigned long sz;
char *item;
} itemset;
void additem(char** ram,itemset** items,char* thing){
unsigned long sz=strlen(thing);
if (sz > 20000 || sz < 1){return;}
(**items).item=*ram;
(*ram)+=sz;
(**items).sz=sz;
memcpy((char*)((**items).item),thing,sz);
(*items)++;
}
void showitems(itemset* items){
unsigned long ct=1;
while(items->sz > 0){
char buf[items->sz+2];
memset(buf,0,items->sz+2);
memcpy(buf,items->item,items->sz);
printf("Item %d: size: %d = %s\n",ct,items->sz,buf);
items++;ct++;
}
}
int main(){
char itembuf[50000];
itemset* myitems=(itemset*)itembuf;
char* mp=calloc(1,100000);
char* wmp=mp;
itemset* items=myitems;
additem(&wmp,&myitems,"Test");
additem(&wmp,&myitems,"Tests");
additem(&wmp,&myitems,"Tester");
additem(&wmp,&myitems,"Testing");
showitems(items);
printf("%s\n",mp);
free(mp);
}
После выполнения, правильный выход отображается на экране следующим образом:
Item 1: size: 4 = Test
Item 2: size: 5 = Tests
Item 3: size: 6 = Tester
Item 4: size: 7 = Testing
TestTestsTesterTesting
Для функции AddItem работать, это требует двух указателей, которые автоматически обновляются. один для обновления адреса памяти RAM, а один - для обновления адреса памяти стека структуры.
Мне интересно, есть ли способ обновить функцию и назвать ее так, чтобы только один указатель был передан и обновлен. Например:
additem(&stuff,"Test");
Я хочу, чтобы общая функциональность программы по-прежнему быть таким же, но я не хочу использовать массив фиксированного обугленный внутри структуры, как бы тратить драгоценную память.
Этот вопрос может быть лучше подходит на код обзора HTTP: //codereview.stackexchange .com/ –
Вы всегда можете связать несколько значений в структуре и передать им указатели. Затем вы можете написать функции для инициализации этой структуры и ее очистки. Вызывающий код никогда не должен беспокоиться о сохранении всех переменных в синхронизации. –