As we all know, strcpy_s is a safety version of strcpy.
But I wonder how it works ...
let's see some examples.
strpy_s's declaration:
errno_t strcpy_s(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)
eg1
char dest[5];
char* src = "abcdefg";
strcpy_s(dest,5,src);
It will return an assertion.
I think I can understand this, use _SIZE to make sure we can't copy more characters than _SIZE
But.. I can't understand this:
char dest[5];
char* src = "abcdefg";
strcpy_s(dest,10,src);
we can still get a assertion, how did that happened?
ps,error was:
Debug Assertion Failed
expression : (L"Buffer is too small "&&0)
In VS2013
will strcpy_s checks the size of dest inside its body?? and if it's true , how? how to check a pointer like _DEST?
This is actually how to get the size of a stack array at run time without decaying it to a pointer:
template<typename T, size_t N>
size_t arrSize(T (&array)[N])
{
return N;
}
You send it as a template reference, and the template mechanism deduces the size. So, you can do something like
int myArray[10];
cout << arrSize(myArray); // will display 10
So my guess is that this is how the "safe" MS strcpy_s
is checking the sizes. Otherwise, if you pass just a pointer, there is NO STANDARD-COMPLIANT way of getting the size.