Vad är felet på mitt program
Hej, jag har svårt att leta efter vad som är fel med min kod. Jag har inte fått något fel- eller varningsmeddelande som talar om för mig vad felet är och jag undrar om någon av er kan hjälpa mig.
Sättet som programmet ska köras på är att om jag har gjort allt korrekt ska följande skrivas ut "Department of Redundancy Department" på skärmen. Men när jag kör programmet står det bara:
Memory is allocated
Memory is allocated
Assertion failed: source != NULL
och jag får också ett felsökningsfel på skärmen. Jag använder Microsoft Visual Studio. Här är min kod
#include "dstring.h"
#include <string.h>
#include <stdlib.h>
#include <assert.h>
DString dstring_initialize(const char* str)
{
assert(str != NULL);
str=(char*)malloc(sizeof(char));
if (str == NULL) {
printf("Memmory cannot be allocated\n");
}
else
{
printf("Memmory is allocated\n");
} free(str);
return NULL;
}
int dstring_concatenate(DString* destination, DString source)
{
int size = 0;
int temp = 0;
assert(destination != NULL);
assert(source != NULL);
assert(*destination != NULL);
size = strlen(*destination) + strlen(source) + 1; // +1 för nollterminatorn
// Försök att omallokera minne för destinationssträngen
char* tmp = realloc(*destination, size);
if (tmp == NULL) {
printf("Memory allocation faild\n");
return 0;
}
// Omfördelningen lyckades, så uppdatera destinationsvariabeln
*destination = tmp;
temp = strcat_s(*destination, size, source);
if (temp != 0) {
// Sammankoppling misslyckades
printf("Sammankoppling misslyckades\n");
return 0;
}
// Sammankoppling lyckades
return 1;
}
void dstring_truncate(DString* destination, unsigned int truncatedLength)
{
if (destination == NULL) {
return;
}
// Kontrollera att *destination inte är NULL
if (*destination == NULL) {
return;
}
// Kontrollera att truncatedLength inte är negativ
if (truncatedLength < 0) {
return;
}
// Omfördela minne för destinationssträngen
char* tmp = realloc(*destination, truncatedLength + 1); // +1 for the null terminator
// kolla om realloc fungerade
if (tmp == NULL) {
// realloc misslyckas
return;
}
// Omfördelningen lyckades, så uppdatera destinationsvariabeln
*destination = tmp;
// Set the null terminator at the truncatedLength
(*destination)[truncatedLength] = '\0';
}
void dstring_print(DString str, FILE* textfile)
{
if (str == NULL || textfile == NULL) { // kolla om textfill och str inte är NULL
return;
}
// Skriv str till textfilen
fputs(str, textfile);
}
void dstring_delete(DString* stringToDelete)
{
assert(stringToDelete != NULL);
// Frigör minnet som pekas på av stringToDelete
free(*stringToDelete);
// Sätt stringToDelete till NULL
*stringToDelete = NULL;
}
int main(void)
{
DString str1, str2;
str1 = dstring_initialize("Department of ");
str2 = dstring_initialize("Redundancy ");
int result = dstring_concatenate(&str1, str2); // Merges str1 and str2 and stores the result in str1. Str1 now contains "Department of Redundancy"
assert(result == 1); //successfully allocated memory
/* If any of these fail, there is something wrong with your implementation
Use the debugger to find out what */
assert(str1 != NULL);
assert(str2 != NULL);
assert(strlen(str2) == 11);
assert(strlen(str1) == 25); // The merged string should have a length of 25
/* The following should print "Department of Redundancy Department" on the screen
stdout is a text file representing the console window */
dstring_print(str1, stdout); // Prints "Department of Redundancy"
dstring_truncate(&str1, 10); // Abbreviates str1 said to contain only the first 10 characters of the string, i.e. "Department"
assert(strlen(str1) == 10);
assert(strlen(str2) == 11);
dstring_print(str1, stdout); // Prints "Department"
/* Free the dynamically allocated memory for the strings */
dstring_delete(&str1);
dstring_delete(&str2);
/* Make sure the strings are zeroed */
assert(str1 == NULL);
assert(str2 == NULL);
return 0;
Disclaimer -> Utan att ha sett hur DString ser ut, jag
antar det är en pekare. Normalt "gillas det inte" att
gömma en pekare i en typedef för det gör koden lite
svårare att läsa samt de kan orsaka problem i olika
situationer
Din dstring_initialize returnerar alltid NULL, i princip gör den ingenting.
// svårt att se nyttan, förutom att allokera 1 byte
DString dstring_initialize(const char* str)
{
assert(str != NULL);
str=(char*)malloc(sizeof(char));
if (str == NULL) {
printf("Memmory cannot be allocated\n");
}
else
{
printf("Memmory is allocated\n");
}
free(str);
return NULL;
}
Antagligen ville du säkert istället skapa en DString däri och returnera den nya minnesblock med innehåll fr in-parametern.
Testa OpenAI, den förklarar allt du gjort fel och fixar allting som är fel