2017-06-12 7 views
-1

Ich habe einen Fehler in der letzten Zeile, in Nullstring, eine Funktion, um alles Zeichenfolge Einstellung ‚\ 0‘ mit einem einfachen für()C - Schreibzugriffsverletzung

void function (unsigned char inputArray[], size_t inputSize) 
{ 
    size_t cellSize; 
    if (inputSize <= 256) 
     cellSize = 1; 
    else 
     cellSize = ceil(inputSize/2/256) + 1; 


    // Sub Box 
    unsigned char subBox[255]; 
    for (size_t line = 0; line < 255; line++) 
     subBox[line] = 0; 

    generate_SubBox(subBox, key); 
    // Sub Box 


    // Sub Box reverse 
    unsigned char subBox_Inverse[255]; 
    for (size_t line = 0; line < 255; line++) 
     subBox_Inverse[line] = 0; 

    generate_SubBox_Inverse(subBox_Inverse, subBox, key); 
    // Sub Box reverse   

    unsigned char* inputArray2 = NULL; 
    inputArray2 = malloc(sizeof(unsigned char)* inputSize/2); 
    verifyMalloc(inputArray2); 
    nullString(inputArray2, inputSize/2); 

    unsigned char string_temp[3] = { 0 }; 
    size_t w = 0; 
    for (size_t i = 0; i < inputSize/2; i++) 
    { 
     string_temp[0] = inputArray[w]; 
     string_temp[1] = inputArray[w + 1]; 

     inputArray2[i] = strtoll(string_temp, NULL, 16); 

     w += 2; 
    } 
} 

I versuchte Zeile pro Zeile neutralisierte Alle Befehle kommen vor nullString(), indem sie kommentiert werden, aber es ändert nichts.

Wenn ich Nullstring neutralisieren, kommt der Fehler nach, bei

inputArray2[i] = strtoll(...)

Hoffe, dass Sie die Antwort haben :)

Vielen Dank im Voraus!

EDIT: Hier Nullstring:

void nullString(unsigned char input[], size_t length) 
{ 
    for (size_t x = 0; x < length; x++) 
     input[x] = '\0'; 
} 

ich alle Anweisungen vor dem Nullstring kommentiert, der Fehler immer noch da.

ich Variablen auch überprüft und sie sehen alle wie gut

EDIT 2: verifyMalloc:

void verifyMalloc(int* pointer) 
{ 
    if (pointer == NULL) 
    { 
     perror("Erreur"); 

     Sleep(15000); 
     exit(0); 
    } 
} 
+1

Wahrscheinlich ist Ihr Problem in 'nullString()' oder woanders. Würde es Ihnen etwas ausmachen, diese Funktion zu zeigen? – harper

+0

Ideen, um den Fehler zu isolieren: 1) deaktivieren Sie den gesamten Code, der nicht mit 'inputArray2' verwandt ist, durch Auskommentieren. Wenn der Fehler weg ist, suchen Sie nach der letzten Änderung. 2) Verwenden Sie einen Debugger und überprüfen Sie die Variablen kurz vor dem Ort, an dem die Ausnahme auftritt. – harper

+0

Wie kann ich nullString buchen? Muss ich meinen ersten Beitrag bearbeiten? –

Antwort

0

Alles, was wir ernsthaft sind zu sehen ist anspielend #include <stdlib.h> zu vergessen (und die Warnungen zu ignorieren daraus resultierenden). Diese

ist, was vielleicht passiert, wenn man malloc() verwenden, ohne stdlib.h in der gleichen Datei wie:

  • der Compiler die malloc() Funktion betrachten implizit deklariert werden, das heißt, es wird angenommen, dass es Rückgabetypen ist ist int (anstelle von *void).
  • Diese könnte funktionieren, wenn sizeof (int) das gleiche wie sizeof (*void) ist. Aber wenn int 32-Bit ist, während Zeiger 64-Bits sind, dann kann die von malloc() zurückgegebene Adresse die Hälfte ihrer Bits verlieren und auf eine ungültige Adresse zeigen.
0

Versuchen

void bzero(void *s, size_t n); or 
void *memset(void *s, int c, size_t n); 

statt Ihrer Nullstring() und für() mit etwas [x] = 0 Schleifen. Dann

, bedeutet dies nicht das gesamte Array machen auf Null gesetzt:

unsigned char string_temp[3] = { 0 }; 

Dies macht

string[0] = 0; 
string[1] = god_knows; 
string[2] = god_knows_not; 

so either - unsigned char string_temp[3] = {0,0,0}; 
or bzero(string_temp,3); 

Folglich wird, wenn Sie dies tun:

string_temp[0] = inputArray[w]; 
string_temp[1] = inputArray[w + 1]; 

inputArray2[i] = strtoll(string_temp, NULL, 16); 

strtoll() wird rate mal, wann du aufhören sollst. Keine Garantie dies wäre bei String_temp [2].

Dann sollte das genug sein:

unsigned char* inputArray2 = malloc(sizeof(unsigned char) * inputSize/2); 

inputArray2 wird NULL sein, wenn malloc fehlgeschlagen ist, oder ein gültiger Zeiger, wenn es erfolgreich war.

Vielleicht möchten Sie Ihre Eingabe Größe/this_and_arithmetics überprüfen. Liefert es wirklich, was Sie erwarten? Sie könnten vom Divisionsergebnis von Ganzzahloperanden überrascht sein.

Das sieht auch verdächtig:

inputArray2[i] = strtoll(string_temp, NULL, 16); 

strtoll kehrt Longlong integer, aber Ihr inputArray2 ist von unsigned char-Typ.Also versuchen Sie 8 Bytes zu speichern (sizeof longlong = 8) und Sie reservierten Platz nur für eine (sizeof char = 1)

neu deklarieren Ihre inputArray2 so lange lange

long long *inputArray2 = malloc(sizeof(long long) * inputSize /2); 

Und versuchen, dies mit memset (): bei Ihnen

size_t size = sizeof(long long) * inputSize/2; 
//Do you really need long long? You are storing max three digits. uint_8 will be enough 

long long* inputArray2 = malloc(size); 
memset(inputArray2, 0, size); 
+0

inputSize/2 gibt mir den genauen Wert ich bin, kein Problem auf dieser Ebene, so verließ ich inputArray2 = malloc (...) wie es war Danke für string_temp [3] = {0}, es ist jetzt string_temp [3] = {0, 0, 0} Memset (weil ich unter Windows 10 und Visual Studio bin) hilft nicht, selbe Fehler aber beim Ausführen von memset. Ich überprüfte auch das Malloc mit if (... == NULL), kein Problem, das malloc ist gut ... –

+0

Woher bekommst du den Fehler jetzt? In memset(), die Sie jetzt anstelle von nullString() verwenden; Oder später, wenn Sie versuchen, inputArray2 [i] = strtoll(); – Sokre

+0

Der Fehler ist in memset(), ich benutze nullString nicht mehr. Wenn ich memset() kommentiere, dann kommt der Fehler bei "inputArray2 [i] = strtoll (string_temp, NULL, 16);" –