pointers - Problems with free() function in C -
i have while
loop inside for
loop handle strings. here structure of code:
char mystring[1000]; //initialize , maybe change mystring for(/*conditions*/){ while(/*conditions*/){ if(strchr(mystring,' ') == null){ break; } char *temp = malloc(sizeof(char) * strlen(mystring)); strcpy(temp,mystring); *strchr(temp,' ') = '\0'; strcat(mystring," "); strcat(mystring,temp); free(temp); } }
sometimes, code works fine, process ends , returns 3 means there error (3 return value when try use null shouldn't example mypointer->example
mypointer
null). after tests, found out line causing problem free(temp);
. tried replace if(temp != null){free(temp);}
didn't change anything. tried declare temp
char temp[1000]
instead of malloc
, take away free(temp);
line still same thing. if take away free(temp);
line , still use malloc
problem solved instead there huge memory leak, can't that. if there error or not depends on in mystring
string, means if there value in there, there error, , if there value, there never error, can't manage find out type of values work , ones don't, seems random.
why free(temp);
work , not , how can work?
the major problem is, you're allocating 1 element less required memory.
strlen()
not account terminating null, you're 1 short of required memory. later, doing
strcpy(temp,mystring);
is out of bound access (to store terminating null) invokes undefined behavior. result, see
sometimes, code works fine, process ends , returns 3 means there error[....]
to resolve, should modify allocation statement like
char *temp = malloc(strlen(mystring) + 1); // +1 terminating null, // sizeof(char) == 1, guaranteed c standard.
that said, man page
thestrchr()
,strrchr()
functions return pointer matched character or null if character not found. [...]
and, highlighted scenario,
*strchr(temp,' ') = '\0';
attempts dereference null-pointer constant (null
) invalid , again, invokes ub. check valid return value before dereferecing returned pointer
Comments
Post a Comment