I am trying to learn the basics of C, C++ programming, so I've started with "C". I have lots of experience programming with Java and VB. But "C" is what I want to learn. So I'm having an issue, trying to understand the "malloc" and "free" functions.
I am using Borland C++ 4.5 and Visual C++ 6.0 on Windows 98. - (Just a testing environment, want to learn the very basic and early windows programming).
Refer to this code:
struct String
{
char *value;
int length;
};
char *initString(const char *value)
{
char *str = (char*)malloc( strlen(value)+1 );
strcpy(str, value);
return str;
}
struct String *InitString(const char *text)
{
struct String *str = (struct String*)malloc( sizeof(struct String) );
str->value = initString(text);
str->length = strlen( str->value );
return str;
}
void freeString(struct String *str)
{
free(str->value);
free(str);
str = NULL;
}
int main(int argv, char *argc[])
{
struct String *theString = InitString("Testring string struct");
printf("String: %s\n", theString->value);
printf("String Length: %d\n", theString->length);
freeString(theString);
printf("\nData: %s", theString->value);
return 0;
}
When this program runs, the result is correct.
After I call "freeString(theString)
", the function does free the memory and set the
struct to NULL inside the "freeString()" function, that should free the "theString" inside "main()" as I pass in the pointer to "theString", but when the function returns: "theString" is not "NULL".
On Borland 4.5 I can still call the "printf" with "theString->value" and it prints the string. On Visual C++ the program crashes when calling "printf" - BUT "theString" is still not "NULL". When I trace the program in debug mode, the "struct" is being freed inside the "freeString()" function and the struct is set to NULL, but when the function returns the "theString" is not NULL and the "value" is still usable on Borland, but not on Visual C++.
So I'm trying to understand, what is going on here? Is there some de-reference that should be done?
Thank you in advance!
free(struct)
do? It is a pointer, yes, but not to a dynamically allocated space. It's late (in the UK) so please excuse me if I'm wrong. I second the comments for a more modern compiler. – user257111