Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C wywołanie realloc na tablicy charów w funkcji z przekazanym wskaźnikiem

jowyma 09 Mar 2017 14:45 597 9
  • #1 09 Mar 2017 14:45
    jowyma
    Poziom 22  

    Proszę o pomoc, bo porady w internecie nie sprawdziły się i kod nadal nie działa.
    Chcę przekazać z programu głównego do funkcji wskaźnik na tablicę char'ów, w funkcji wywołać realloca, zwiększyć zarezerwowaną pamięć i potem w funkcji zmodyfikować tę tablicę (dołożyć z przodu "0x" a całą resztę znaków przesunąć w tablicy o dwa pola - żeby zrobić miejsce na wstawienie "0x". Czyli mam "123" a chcę mieć "0x123".

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 9
  • Pomocny post
    #2 09 Mar 2017 15:34
    pietia86
    Poziom 25  

    Zauważ że instrukcja

    Kod: c
    Zaloguj się, aby zobaczyć kod

    powoduje zalokowanie pamięci. Następnie:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Powoduje zgubienie wskaźnika do wcześniej zaalokowanej pamięci i ustawienie A na stałą "Test". W kolejnych instrukcjach przekazujesz wskaźnik na stałą do funkcji która ma coś pod ten wskaźnik skopiować.

    Dodatkowym błędem jest instrukcja
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Pobierasz w niej dane sprzed wskaźnika, takie działanie może powodować problemy.

    0
  • #3 09 Mar 2017 16:13
    rajszym
    Poziom 19  

    jowyma napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    1. Zapoznaj się z funkcją strcpy
    jowyma napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    2. Oprócz błędu, który pokazał kolega @pietia86 jest jeszcze jeden. Do funkcji memmove przekazuj wskaźnik a nie adres wskaźnika. No i ilość kopiowanych bajtów też do poprawienia.

    0
  • #4 09 Mar 2017 16:13
    jowyma
    Poziom 22  

    Realloc już działa poprawnie, ale teraz mam problem jak przesunąć aktualny string o 2 miejsca w prawo, a na miejscach 0 i 1 w stringu dołożyć '0' i 'b'.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 09 Mar 2017 16:28
    rajszym
    Poziom 19  

    jowyma napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Błąd. Str2 wskazuje na ciąg "0x\0". Nie ma tam miejsca na dodanie ciągu *str. Funkcja strcat nie wykonuje realokacji pamięci.

    Dodano po 6 [minuty]:

    jowyma napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Tutaj nie masz warninga?

    0
  • #6 09 Mar 2017 20:10
    jowyma
    Poziom 22  

    Dziękuję za pomoc, okazało się, że zamiast strcat znacznie lepiej używać snprintf, który rozwiązuje wiele problemów kontatenacji. Kod wreszcie działa :).

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 09 Mar 2017 21:05
    JacekCz
    Poziom 36  

    jowyma napisał:
    Dziękuję za pomoc, okazało się, że zamiast strcat znacznie lepiej używać snprintf, który rozwiązuje wiele problemów kontatenacji. Kod wreszcie działa :).


    I tak, i nie.
    strcat i rodzina jest bardzo wydajne, da się wziąć odpowiedzialność za zużycie RAM (wyłącznie na stosie). Rodzina xxxxprintf ma duże możliwości, ale są to funkcje uważane za ciężkie

    Ja osobiście nie przyjmuję zbyt łatwo argumentu "kod w C działa". jest to język PEŁEN Undefined Behaviour, czyli błedów które popełnił programista, ale nie miały okazji się ujawnić.

    W konkretnym Twoim kodzie to nie snprifntf uleczyło sytuację, ale powołanie bufora na stosie. Analogiczny bufor jest na pewno łatwiejszy do intuicyjnego zarządzania, nie tzreba go alokować, zwalniać, nadal mozna go przejechać (i jak niewiele, często się to nie ujawni).

    Powiedziałbym tak: strzelając sporo razy, trafiłeś w coś, co doraźnie chodzi, ale co nie ma ani gwarantowanej bezbłędności (nie analizuję dokładnie, pobieżny przegląd kodu) i odporności na zmianę warunków. I błednie wnioskujesz, co uleczyło sytuację.

    Z prostych, a zawsze przydatnych rad, dawaj zawsze jak się da dla parametrów tylko odczytywanych słowo const. Gdybyś je miał, same ostrzeżenia kompilatora by Ci pól problemu rozwiązały.

    0
  • #8 10 Mar 2017 03:45
    LED5W
    Poziom 32  

    Z tą tablicą buf to przesadziłeś. Coś pokręciłeś parametry memmove. Tak powinno być:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Nie uwzględniłeś przypadków w których str lub str2 będzie mieć wartość 0.
    Skąd te magiczne liczby (2, 7, 4)?

    0
  • #9 11 Mar 2017 20:53
    jowyma
    Poziom 22  

    Liczby 2, 4 i 7 wynikają z tego, że przedstawiony kod to wycinek z innego kodu, gdzie te wartości mają sens.
    Co do konkatenacji dwóch stringów to nie umiem jej zrobić za pomocą strcat - miło by było gdybyś ktoś mi pokazał.

    0
  • #10 11 Mar 2017 21:59
    rajszym
    Poziom 19  

    jowyma napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0