This is a really mysterious behavior I can't get around.
I'm trying to edit the string of one variable and then copy again to the source. I have the following code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char word[100] = "1 hash";
char* sp = malloc(100);
sp = strchr(word, ' ');
sp ;
// the "bug" still happens with strcpy instead of strncpy
strncpy(word, sp, 100);
printf("%s\n", word);
}
The output is:
hhsh
It should've been hash
.
The weird thing is that "1 hash" is the only string I found that this bug happens. All the other strings I tried gave me the expected output. For example: "1 huhanh" -> huhanh
or "3 a h c" -> a h c
Any help would be greatly appreciated.
CodePudding user response:
You have undefined behavior. The malloc
pointer is ignored.
So, when you do the strcpy
, sp
and word
are part of the same string.
This is UB. Which means it may segfault. It may work. It may produce incorrect results.
Here is the corrected code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main()
{
char word[100] = "1 hash";
char *copy = malloc(100);
char *sp = strchr(word, ' ');
sp ;
// the "bug" still happens with strcpy instead of strncpy
strncpy(copy, sp, 100);
printf("%s\n", copy);
}
CodePudding user response:
char* sp = malloc(100);
The problem is that this allocated memory is not used, at all. strchr
returns a pointer to a character in the original string. And according to the documentation
destination and source shall not overlap
CodePudding user response:
this code
char* sp = malloc(100);
sp = strchr(word, ' ');
allocates some memory then leaks it away. sp ends up pointed into the 'word' on the stack