这是一个片段:
void addproductInterface(Tsklep **head){
char* name = (char*)malloc(sizeof(char)*100);
double price;
do{
printf("Name: ");
scanf("%s[^\n]", name);
fflush(stdin);
printf("\nPrice: ");
scanf("%lf", &price);
fflush(stdin);
addProduct(&(*head), name, price);
} while(prompt("Do you want to add another one?"));
它有效,但在我添加另一个产品后,它会将之前的(和之前的)产品更改为此名称。 看来,我每次都传递相同的指针而我只是更改了一个数组(当我添加另一个产品时)它指向。 我理解正确吗? 你有任何想法如何解决它?
答案 0 :(得分:3)
这听起来像你描述的,是的。如果没有看到addProduct()
的代码,很难确定,但这将是分配新内存的地方。
你应该为输入使用一个临时的,自动的(在堆栈上)缓冲区,然后在addProduct()
中存储记录时进行永久分配:
do{
char name[64];
double price;
printf("Name: ");
scanf("%63s", name);
fflush(stdin);
printf("\nPrice: ");
scanf("%lf", &price);
fflush(stdin);
addProduct(&(*head), name, price);
} while(prompt("Do you want to add another one?"));
您还应该对scanf()
次呼叫进行错误检查,如果给出意外输入,它们可能会失败。
答案 1 :(得分:2)
在函数开头只分配一次名称,因此在每次循环执行时覆盖内容。在do-while循环中移动分配。
答案 2 :(得分:1)
将name
指向的分配移动到循环中。
答案 3 :(得分:1)
将行char* name = (char*)malloc(sizeof(char)*100);
移动到do while
循环内,如下所示,
do{
char* name = (char*)malloc(sizeof(char)*100);
printf("Name: ");
scanf("%s[^\n]", name);
fflush(stdin);
printf("\nPrice: ");
scanf("%lf", &price);
fflush(stdin);
addProduct(&(*head), name, price);
} while(prompt("Do you want to add another one?"));
答案 4 :(得分:1)
你应该在循环中移动你的分配。
(顺便说一句,您对scanf的调用容易出现溢出name
,因为您没有限制大小。)