[c] access violation / speicherzugriffsfehler

raven

Well-known member
20 April 2006
5.038
540
Hiho,

ich hab nen Problem mit C. Habe seit Eeeewigkeiten nichts mehr darin programmiert, und muss mich nun erstmal ordentlich wieder eingewöhnen. Und dazu wahrscheinlich auch erstmal nen paar dumme Probleme verursachen, um Hilfe zu holen :roll:

Also - ich bekomme einen einfachen Speicherzugriffsfehler, im speziellen geht es um dieses Codestück hier:

PHP:
  char *userurl, *efurl;
[...]
  mresult = mysql_use_result(&mysql);
  mresrows = mysql_num_rows(mresult);
  
  efurl = (char *) malloc(mresrows * sizeof(char));
  
  while ((mrow = mysql_fetch_row(mresult))){
    sprintf(&efurl[k], "%s?key=%s", (char *)&mrow[6], (char *)&mrow[7]);
    k++;
  }

Das Problem scheint ganz offenbar beim sprintf zu liegen, als ich das auskommentiert habe, kam zumindest kein Fehler mehr. Ich hab absolut keinen Schimmer mehr von C, deswegen: helft mir ;)

danke
Sascha
 
aender mal
Code:
    sprintf(&efurl[k], "%s?key=%s", (char *)&mrow[6], (char *)&mrow[7]);
in
Code:
    sprintf(&efurl[k], "%s?key=%s", mrow[6], mrow[7]);

Die einzelnen Strings in MYSQL_RES sind bereits vom Typ char *, eine Referenz brauchts also auch nicht.

Des Weiteren ist dein efurl chararray nur Anzahl der Rows * sizeof(char) lang. Was du jedoch willst ist, dass du Anzahl der Rows * sizeof(char*) viele Strings willst, also ein Array of Chararrays.

Das ginge dann so:

Code:
        char** f;
        int i = 0;

        f = malloc(rows * sizeof(char*));

        for (i = 0; i < rows; i++)
                f[i] = malloc((int)length[i] * sizeof(char));

Wobei rows die Anzahl der Rows im Result ist und length die Laenge des jeweiligen Feldes (mysql_fetch_lenghts()) - ausserdem solltest du die Laenge in dein sprintf einbauen, da man sonst leicht in nicht alloziierten Speicher schreiben kann - %.*s als Format tuts - dann muss der erste Parameter die Laenge des zweiten Parameters sein.

Das sollte dir soweit helfen, dass dus wieder hinbiegen kannst, sonst greif ruhig mal zu gdb und step durch deinen Code durch, per Google findest du unzaehlige Howtos fuer gdb, ansonsten meld dich nochmal hier.