指向char的指针

时间:2013-05-31 09:04:33

标签: c visual-studio-2010 pointers

这是一个片段:

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

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

5 个答案:

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

另外,don't cast the return value of malloc() in C

答案 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,因为您没有限制大小。)