2017-10-10 5 views
-1

im Versuch, eine Funktion zu kodieren, die eine Zeichenfolge auf mehr diejenigen spalten, ich weiß, ich habe eine Menge von zugewiesenen Speicherplatz nicht freigegeben, teste ich gerade dieses Stück aber valgrind zeigt mirWarum springt mein Programm aus? C

Conditional jump or move depends on uninitialised value(s) 
==25613== at 0x4C2DB3C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==25613== by 0x40090C: split (strutil.c:32) 
==25613== by 0x400A00: main (strutil.c:45) 
==25613== Uninitialised value was created by a stack allocation 
==25613== at 0x400720: split (strutil.c:9) 

ein paar ähnlichen Fehler und dann Sigsem und schließt. meine Sorge ist, dass, wenn ich es mit gdb in das für Kreis, der zählt das "," es wie erwartet, bis es den Wert erreicht "," dann überspringt gesamte cicle aber die i + + und geht weiter. Warum macht es das? Ich habe gdb beobachtet und alle Parameter (str [i], sep) haben die richtigen Werte im Moment vor der Bedingung.

#include "strutil.h" 
#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 

char** split(const char* str, char sep){ 
size_t cant = 2; 
size_t i; 
for(i = 0; i < strlen(str); i++){//this is line 9 
    if(str[i] == sep) 
     cant ++; 
    i++; 
} 
size_t corte[cant]; 
i = 0; 
corte[0] = 0; 
size_t j = 1; 
size_t cant_corte[cant]; 
for(i = 0; i < strlen(str); i++){ 
    if(str[i] == sep){ 
     corte[j] = i + 1; 
     cant_corte[j - 1] = corte[j] - corte[j - 1]; 
     //printf("pasa\n"); 
     j++; 
    } 
    printf("pasa\n"); 
    i++; 
} 
char** strv = malloc(sizeof(char*) * cant); 
    if (strv == NULL)return NULL; 
for(i=0; i < cant; i++){ 
    strv[i] = malloc(sizeof(char) * cant_corte[i]); 
    if (strv[i] == NULL)return NULL; 
    strncpy(strv[i], str + corte[i], cant_corte[i-1]); 
    strcat(strv[i], "\0"); 
} 
strv[cant + 2] = NULL; 
return strv; 
} 

int main(){ 
char* eje = "abc,defg"; 
printf("%s\n", eje); 
char r = ','; 
char** prueba = split(eje, r); 
printf("%s\n", prueba[0]); 
getchar(); 
return 0; 
} 
+0

'cant_corte [i-1]' - UB für i = 0 –

+0

'strv [cant + 2] = NULL;': dies geschieht außerhalb der Grenzen. – BLUEPIXY

+1

@ DavidC.Rankin Was? 'strv' ist ein Rückgabewert von' malloc', der sicher testbar ist. 'if (* strv == NULL)' wäre etwas anderes, und Valgrind wäre völlig korrekt, sich darüber zu beschweren. – aschepler

Antwort

1

Wenn Sie Ihre i Variable nicht möchten, zu erhöhen, um fortzufahren, stellen Sie sicher, in Ihrer for-Schleife Sie i nicht erhöht, und sich stattdessen auf die abhängig for-Schleife seine Arbeit zu tun. (Inkrementiere jedes Mal, wenn die Bedingung wahr ist).

+0

Ich bin verrückt geworden und die Sache ist, dass ich eine Weile vor dem Forloop verwendet habe, und nicht das i ++ tut mir wirklich leid für deine Zeit verschwendet –

+0

Keine Verschwendung meiner Zeit, einfache Fehler sind die harten manchmal. –

Verwandte Themen