- Registriert
- 3 Aug. 2014
- Beiträge
- 28.573
Ich hab gerade ein kleines C Problem, ich arbeite gerade an einer In Place String Replace Funktion, die funktioniert auch soweit ganz gut wie gedacht, aber ich bekomme immer einen Memory corruption Fehler bei der 2ten Variante mit Memmove beim Freeing des Elements.
Die Frage ist, wie muß der Code beschaffen sein damit das Element mit free(elm) aufgelöst werden kann ohne Speicherfehler zu verursachen?
Bei Bedarf stelle ich den gesamten Source Code zu Verfügung, ist analog zu diesem Posting/Thema. Ich würde das gerne in Place machen so das die Daten die an die Replace Funktion übergeben werden auch direkt umgearbeitet werden.
Der aufrufende Code sieht so aus:
[src=c]// Find the common blocks with equal counts across files
// Fills the sampleStore
buildSampleList(filesToAnalyze);
// Modify the dnaFiles data to figure out how many left samples there are
// in those files and count them together with the other sequences to get the file sanmples
// Clean the sample file data from found tags
for (i = 0; i < dnaFiles.fileCount; i++) {
for (j = 0; j < sampleStore.count; j++) {
printf("%s\n", sampleStore.samples[j].sequence);
replace(dnaFiles.files.data, sampleStore.samples[j].sequence, "_");
printf("%s\n", dnaFiles.files.data);
break;
}
break;
}[/src]
Folgender Code funktioniert auch soweit, also das gesuchte mit einem "_" zu überschreiben...
Folgender Code funktioniert zwar auch, hier wird Memmove genutzt um den Inhalt des Strings zu verschieben, ich kann den Inhalt ausgeben, aber ich bekomme immer den folgenden Speicherfehler beeim freeing.
Ich hab auch schon versucht den Inhalt mit Realloc zu schrumpfen, bekomme aber immer einen "invalid next size"-Error obwohl chars + strlen(data) genutzt wurde
Die Cleaning Ausgabe (dnaFiles[x].data ist eines der Objekte die memmoved sind):
[src=c]Cleaning ressources...
Freeing alphabet...
Freeing block128...
Freeing dnaFiles data...
*** Error in `./dnalyzer': double free or corruption (!prev): 0x00000000008c20b0 ***[/src]
Die Frage ist, wie muß der Code beschaffen sein damit das Element mit free(elm) aufgelöst werden kann ohne Speicherfehler zu verursachen?
Bei Bedarf stelle ich den gesamten Source Code zu Verfügung, ist analog zu diesem Posting/Thema. Ich würde das gerne in Place machen so das die Daten die an die Replace Funktion übergeben werden auch direkt umgearbeitet werden.
Der aufrufende Code sieht so aus:
[src=c]// Find the common blocks with equal counts across files
// Fills the sampleStore
buildSampleList(filesToAnalyze);
// Modify the dnaFiles data to figure out how many left samples there are
// in those files and count them together with the other sequences to get the file sanmples
// Clean the sample file data from found tags
for (i = 0; i < dnaFiles.fileCount; i++) {
for (j = 0; j < sampleStore.count; j++) {
printf("%s\n", sampleStore.samples[j].sequence);
replace(dnaFiles.files.data, sampleStore.samples[j].sequence, "_");
printf("%s\n", dnaFiles.files.data);
break;
}
break;
}[/src]
Folgender Code funktioniert auch soweit, also das gesuchte mit einem "_" zu überschreiben...
[src=c]char* replace(char* data, char* searchString, char replacement) {
unsigned int position, current, offset = 0;
unsigned int dataLength = strlen(data);
unsigned int sizeSearchString = strlen(searchString);
while (position != -1) {
position = indexOf(data, searchString, 0);
if (position != -1) {
current = 0;
while (current < sizeSearchString) {
data[position + current] = replacement;
current++;
}
}
}
return data;
}[/src]
unsigned int position, current, offset = 0;
unsigned int dataLength = strlen(data);
unsigned int sizeSearchString = strlen(searchString);
while (position != -1) {
position = indexOf(data, searchString, 0);
if (position != -1) {
current = 0;
while (current < sizeSearchString) {
data[position + current] = replacement;
current++;
}
}
}
return data;
}[/src]
Folgender Code funktioniert zwar auch, hier wird Memmove genutzt um den Inhalt des Strings zu verschieben, ich kann den Inhalt ausgeben, aber ich bekomme immer den folgenden Speicherfehler beeim freeing.
Ich hab auch schon versucht den Inhalt mit Realloc zu schrumpfen, bekomme aber immer einen "invalid next size"-Error obwohl chars + strlen(data) genutzt wurde
[src=c]char* replace(char* data, char* searchString, char* replacement) {
unsigned int position, current, offset = 0;
unsigned int dataLength = strlen(data);
unsigned int sizeReplacement = strlen(replacement);
unsigned int sizeSearchString = strlen(searchString);
while (position != -1) {
position = indexOf(data, searchString, 0);
if (position != -1) {
current = 0;
while (current < sizeReplacement) {
data[position + current] = replacement[current];
current++;
}
offset = position + sizeReplacement;
dataLength -= (sizeSearchString - sizeReplacement);
memmove(data + offset, data + offset + sizeSearchString, sizeof (char)*(dataLength));
}
}
printf("%d length\n", dataLength);
return data;
}[/src]
unsigned int position, current, offset = 0;
unsigned int dataLength = strlen(data);
unsigned int sizeReplacement = strlen(replacement);
unsigned int sizeSearchString = strlen(searchString);
while (position != -1) {
position = indexOf(data, searchString, 0);
if (position != -1) {
current = 0;
while (current < sizeReplacement) {
data[position + current] = replacement[current];
current++;
}
offset = position + sizeReplacement;
dataLength -= (sizeSearchString - sizeReplacement);
memmove(data + offset, data + offset + sizeSearchString, sizeof (char)*(dataLength));
}
}
printf("%d length\n", dataLength);
return data;
}[/src]
Die Cleaning Ausgabe (dnaFiles[x].data ist eines der Objekte die memmoved sind):
[src=c]Cleaning ressources...
Freeing alphabet...
Freeing block128...
Freeing dnaFiles data...
*** Error in `./dnalyzer': double free or corruption (!prev): 0x00000000008c20b0 ***[/src]
Zuletzt bearbeitet: