Имате нужда от помощ при копиране на c-низове от вграден SQL извличане в друг c-низ в отделна структура

Ударих се в стената с програма, която използва вграден SQL за извличане на редове от таблица на база данни, съхранява данните за реда в структура и след това тези данни се обработват, като резултатите се съхраняват в друга структура и се изпращат към свързан списък. Структурата, където се съхраняват данните за извличане, е както следва:

struct rowstruct {
    char    *first;
    char    *last;
    long    amt;
}   client;

и моята структура, която използвам за съхраняване на обработените данни (и впоследствие натискане като възел в моя свързан списък), е като тази:

struct mystruct {
        char    *firstN;
        char    *lastN;
        long    total;
    }   data;

Проблемът ми е, че при всеки възникнал цикъл на извличане трябва да копирам стойностите client.first и client.last в data.firstN и data.lastN, но не мога да го накарам да работи. Следното, използвайки оператора за присвояване, просто изглежда копира указателя, а не стойността:

data.firstN = client.first;
data.lastN = client.last;

Ако изведа data.firstN и data.lastN след първата итерация на моя цикъл, стойностите изглеждат правилни, но след втората итерация на извличане, първият възел в моя списък ще отразява стойностите от второто извличане, а не от първото.

strcpy ще компилира, но се проваля по време на изпълнение поради грешка в сегментирането, която от четенето тук се дължи на използването на char*, въпреки че не мисля, че мога да използвам char[] или низ, когато извличам данните с помощта на вграден SQL, така че това изглежда като задънена улица.

Сигурен съм, че има начин да направите това и вероятно е очевидно за повечето тук, но съм на загуба. Всяка помощ ще бъде оценена.

Благодаря!


person PSUlion01    schedule 12.10.2012    source източник
comment
разпределихте ли памет за mystruct char *s? т.е. data.firstN = malloc (sizeNeeded) - евентуално чрез strlen - тогава strcpy имайте предвид, че бих предпочел strncpy или друга безопасна алтернатива (strcpy_s?)   -  person im so confused    schedule 12.10.2012
comment
mystruct обаче изглежда излишен   -  person Alexander    schedule 12.10.2012
comment
Съжалявам за объркването с mystruct. Има нещо повече от показаното по-горе... Не разбрах колко объркващо го направих в публикацията.   -  person PSUlion01    schedule 14.10.2012
comment
@AK4749 - Вижте коментара ми по-долу. Сега виждам какво съм направил грешно и предложеното решение беше доста просто, въпреки че вашият коментар прави по-ясно как бих разпределил паметта за char*. Благодаря   -  person PSUlion01    schedule 14.10.2012


Отговори (1)


Ако кодът казва да копирате указателя, точно това се случва.

Вероятно това, което искате, е нещо от рода на

data.firstN = strdup (client.first);
data.lastN = strdup (client.last);

Има повече C++-ish начини да направите същото нещо, но това трябва да ви помогне да преодолеете гърбицата.


Не е необходимо да декларирате повторно структурата. Вместо това можете да декларирате data с

struct rowstruct data;
person wallyk    schedule 12.10.2012
comment
Ако копирате низ с strdup, имайте предвид, че трябва да го free, когато сте готови. Обикновено това би било направено с delete в C++, но това е C функция, която го разпределя с malloc, а не с new. linux.die.net/man/3/strdup - person Geoff Montee; 13.10.2012
comment
@wallyk - Благодаря... Предложеното решение от моя професор беше да се декларират firstN и lastN като масиви от символи, напр. char firstN[30]. Бях загрижен за разпределянето на ненужна памет (или недостатъчна), но тъй като данните идват от предварително дефинирани db полета, той каза, че би било добре да се използва фиксираният размер на масива. Все пак ще опитам вашето предложение, за да видя как работи. Що се отнася до повторното деклариране на структурата, mystruct имаше други членове, които не бяха част от оригинала. - person PSUlion01; 14.10.2012
comment
@Geoff - Благодаря, че посочихте частта за управление на паметта от това. Трябва да отделя малко повече време и наистина да се опитам да разбера по-добре всичко в моята програма. Аз съм сравнително нов в програмирането, без майсторство или някакъв отделен език. Тази конкретна задача ме накара да работя с код на C (поради вградения SQL), но все пак съм запознат повече със C++, така че мисля, че кодът ми е малко Франкенщайн в момента. След като приключа с него, може би мога да го добавя към тази тема за коментари/предложения? Най-добрият начин да научите изглежда е да накарате другите да посочат проблемите и по-предпочитаните подходи. - person PSUlion01; 14.10.2012