2013-05-31 2 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), имя, цена); – 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

Вы должны переместить выделение внутри цикла.

(кстати, ваш призыв к зсапЕ восприимчив к переполнению name, так как вы не ограничивают размер.)

Смежные вопросы