C naruszenie ochrony pamięci


(arekk-99) #1

Witam.

Umieszczam kawałek kodu z którym mam problem.

int strl = strlen(e->event.msg.message);
int strw = 0;
float strzl = strl * 0.001;
int czas = time(NULL);
char* buff;
buff = malloc(sizeof(char*)); // zmienione z char buff[512]; ale i tak nie działało
sprintf(buff, “update userzy set znaki = znaki + %i, wyrazy = wyrazy + %i, wiadomosci = wiadomosci + 1, xp = xp + %i, zl = zl + %i, czas = %i where numer = %i”, strl, strw, strl, strzl, czas, u->numer);
mysql_query(&conn, buff);
naruszenie  ochrony pamięci w linijce sprintf


(Fizyda) #2

Może dlatego że ładujesz do pamięci gdzie masz zarezerwowaną przestrzeń na 1 znak char całego cstringa?

To:

buff = malloc(sizeof(char*));

nie jest rezerwacją dynamicznej tablicy, tylko dynamiczną rezerwacją pamięci dla zmiennej typu char.


(Johny) #3

spróbuj z operatorem,printf wymaga wyłuskanych adresów zmiennych,na pewno jak odwołujesz się do tablicy 

printf (“a=”,&a);.

Spróbuj z każdą z tych zmiennych

Ten malloc nie rezerwuje tablicy.

Co to jest u->numer ?.

Problem jest z uzyskaniem adresu tych zmiennych.Popatrz na rezerwacje pamięci w całym swoim kodzie,czy gdzieś nie rezerwujesz za mało pamięci

strl, strw, strl, strzl, czas, u->numer.

Wyświetl sobie po jednej zmiennej.

sprawdż,buff.

Przypomnij sobie o wskażnikach i wyłuskiwaniu adresów pamięci.

Rzutowanie na float %f,a nie %i


(kowi384) #4

Idąc Twoim tokiem rozumowania co w takim robi: malloc(sizeof(char)) ? Nie to nie jest to samo :slight_smile:

 

Co do problemu trochę za mało kodu.


(Fizyda) #5

Rezerwuje miejsce w pamięci dla jednego znaku (char)? Żadna filozofia.

 

Natomiast malloc(sizeof(char) * 512) zarezerwuje nam miejsce dla tablicy z 512 elementami czyli indeksowanymi od 0 do 511, przy czym jeśli będziesz chciał zapisać do niej cstringa to możesz zapisać maksymalnie 511 swoich znaków ponieważ na końcu musisz mieć znak końca cstringu czyli na elemencie tablicy o indeksie 511 (512 element listy).

 

Pomijam już fakt, że samo zapytanie sql jest prawdopodobnie błędne, na 100% nie powiem bo nie znam struktury tabeli.

 

EDIT:

Sorki masz rację, teraz zauważyłem że rezerwuję pamięć w niewłaściwy sposób, umknęła mi *. Powiem szczerze, że nawet nie wiem w takim ile pamięci będzie zarezerwowanej, nawet nie próbuję zgadywać. Fakt jest taki że w poprzednim wpisie miałem na myśli malloc(sizeof(char))


(arekk-99) #6

Dobra. ALe pomijając samo malloc robiąc char buff[512]; na 511 elementów i tak jest błąd w tym samym miejscu.

struct user *u; // tu jest wszystko. Numer i reszta

ok, może z float, ale wcześniej robiłem %d na każdym.

sprawdzę to wszystko