【发布时间】:2015-10-11 04:04:12
【问题描述】:
这是我的代码:
#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");
我希望整个程序功能保持不变,但我不想在结构内使用固定字符数组,因为这会浪费宝贵的内存。
【问题讨论】:
-
这个问题可能更适合 Code Review codereview.stackexchange.com
-
您总是可以将多个值捆绑在一个结构中并传递指向它的指针。然后,您可以编写函数来初始化该结构并清理它。调用代码永远不必担心保持所有变量同步。
标签: c function pointers memory-management