2013-05-31 88 views
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?")); 

它的工作原理,但在我添加另一个产品,它改变了以前的一个(和以前的)这个名字。 看来,我每次都通过相同的指针,我只是改变一个数组(当我添加另一个产品时)它指向的数组。 我理解正确吗? 你有什么想法如何解决它?

+0

能否请您提供'addProduct'代码 –

回答

1

name指向的内容移到循环中。

+0

谢谢你,现在的工作。关于记忆是什么泄漏?我应该使用免费的吗? – tomdavies

+0

@ TomDavies92:这取决于addProduct()的作用。它是否复制'name'的内容? – alk

+0

它只是设置新元素并添加到列表中, product-> name = name; //从addProduct(&(* head),name,price)传递的名称; – tomdavies

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

2

您只在函数的开头分配一次名称,以便覆盖每个循环执行的内容。在do-while循环中移动分配。

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

-1,这不可能是正确的。如果'addProduct()'看起来像是保留了'name'指针,那么'free()'会使存储的指针无效。 – unwind

+0

这是一个很好的答案,但你应该移除对'free'的调用,这在这里是有害的:从这个问题,很明显'addProduct'不会复制缓冲区,而是在每个'Tsklep'结构中保留一个指向它的指针。 – Medinoc

+0

和顺便说一句。我写在严格的C - 我无法在任何我想要的地方定义变量:/ – tomdavies

1

你应该将内循环的分配。

(顺便说一下,你的电话的scanf容易溢出name,因为你没有限制的大小)。