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;
}
'cant_corte [i-1]' - UB für i = 0 –
'strv [cant + 2] = NULL;': dies geschieht außerhalb der Grenzen. – BLUEPIXY
@ 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