Reputation: 31
After using strcpy source is getting corrupted and getting correct destination. Following is my code please suggest me why my source is getting corrupted? If i keep a fixed size to second character array q[] then my source is not being changed. Why is this strange behaviour. -
I am using MSVC 2005
void function(char* str1,char* str2);
void main()
{
char p[]="Hello world";
char q[]="";
function(p,q);
cout<<"after function calling..."<<endl;
cout<<"string1:"<<"\t"<<p<<endl;
cout<<"string2:"<<"\t"<<q<<endl;
cin.get();
}
void function(char* str1, char* str2)
{
strcpy(str2,str1);
}
OUTPUT:
after function calling...
string1: ld
string2: Hello world
Thanks in advance,
Malathi
Upvotes: 3
Views: 3507
Reputation: 1563
What everyone is saying is half correct. The code is failing because space is not reserved for the copy as others have pointed out correctly. The part that's missing is that your objects are on the stack, not the heap. Therefore it is not only likely, but inevitable that your code will get corrupted as the stack can no longer be unwound.
Upvotes: 3
Reputation: 21
strcpy expects you to provide an allocated storage buffer, not just a char* pointer. If you change char q[]="";
to char q[50];
it will work. Since you're only giving strcpy a pointer to a zero length string it doesn't have enough space to store the copied string and overwrites aka corrupts the memory.
Upvotes: 2
Reputation: 81694
The array "q" is just one byte long; it definitely doesn't have room for the string "Hello, World"! When you try to copy "Hello, World" to q, you end up exceeding the bounds of q and overwriting p, which is adjacent to it on the stack. I imagine drawing a diagram of how these things are laid out on the stack, you could determine exactly why the garbage that ends up in p is just "ld".
Upvotes: 2
Reputation: 72271
In your code, q
, is an one-element array (basing on the length of ""
, which is equal to one due to the null terminator), so it cannot contain the whole string. Hence you can't do a strcpy
because it writes over invalid memory location (tries to write too much data to an array).
Declare q
to be big enough to contain your string. Also, you can use strncpy
to be on the safe side.
Upvotes: 4
Reputation: 6387
strcpy
does not allocate memory required to store the string.
You must allocate enough memory in str2
before you do the strcpy
.
Otherwise, you get undefined behaviour as you are overwriting some non-allocated memory.
Upvotes: 8
Reputation: 91270
char q[] = "";
creates a character array with exactly 1 element - copying more data into it won't reserve more memory for it.
So, what happens is that when you write past the space reserved for q, you start overwriting what's in p - the two variables are next to each other in memory.
Upvotes: 3
Reputation: 318518
q
has only space for 1 character which is the terminating \0
.
Please read a book about C - you need to learn something about memory management.
Most likely your memory looks like this (simplified): Qpppppppppppp
. So when you strcpy to q
, you will overwrite parts of p
's memory.
Since you are using C++: Simply use std::string
and or std::stringstream
instead of raw char arrays.
Upvotes: 6