0

这是一个片段:

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?"));

它可以工作,但是在我添加另一个产品后,它会将前一个(和以前的)更改为此名称。看来,我每次都传递相同的指针,我只是更改它指向的数组(当我添加另一个产品时)。我理解正确吗?您有任何解决方法的想法吗?

4

5 回答 5

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()调用进行错误检查,如果给出意外输入,它们可能会失败。

另外,不要强制转换malloc()in C的返回值。

于 2013-05-31T09:07:10.723 回答
2

您只在函数开始时分配名称一次,因此您在每次循环执行时覆盖内容。在 do-while 循环中移动分配。

于 2013-05-31T09:07:18.287 回答
1

name将指向什么的分配移动到循环中。

于 2013-05-31T09:07:26.037 回答
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?"));
于 2013-05-31T09:12:07.257 回答
1

您应该在循环内移动您的分配。

(顺便说一句,您对 scanf 的调用很容易溢出name,因为您不限制大小。)

于 2013-05-31T09:12:29.193 回答