Sizeof vs Strlen
Solution 1
sizeof
and strlen()
do different things. In this case, your declaration
char string[] = "october";
is the same as
char string[8] = "october";
so the compiler can tell that the size of string
is 8. It does this at compilation time.
However, strlen()
counts the number of characters in the string at run time. So, after you call strcpy()
, string
now contains "september". strlen()
counts the characters and finds 9 of them. Note that you have not allocated enough space for string
to hold "september". This is undefined behaviour.
Solution 2
The Output is correct because
first statement string size was allocated by compiler that is 7+1 (October is 7 bytes & 1 byte for null terminator at compile time)
Second statement: you are copying September (9 bytes to 8 bytes string);
there for you got size of September as 8 bytes (still strlen()
will not work for September it does not have null character)
Solution 3
Your destination array is 8 bytes (length of "october" plus \0) and you want to put in 9 chars in that array.
man strcpy
says:
If the destination string of a strcpy() is not large enough, then anything might happen.
Please tell me what you really want to do, because this smells bad long way
Related videos on Youtube
beparas
Updated on July 09, 2022Comments
-
beparas almost 2 years
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char string[] = "october"; // 7 letters strcpy(string, "september"); // 9 letters printf("the size of %s is %d and the length is %d\n\n", string, sizeof(string), strlen(string)); return 0; }
Output:
$ ./a.out the size of september is 8 and the length is 9
Is there something wrong with my syntax or what?
-
Marlon about 12 yearsYou are writing past the end of the array
string
. This is undefined behavior.string
can only hold 8 characters (7 for "october" and 1 for the null terminator). When you callstrcpy
, you are writing 10 characters to it (9 for "september" and 1 for the null terminator), which means you have gone past the end of the array and are overwriting the adjacent memory. -
Kiran Kumar about 12 yearsNote that
sizeof
is calculated at compile time where asstrlen
is run time. -
caf about 12 years@Naveen: Be aware that that is not necessarily true where VLAs are involved.
-
Cory Gross almost 11 years@caf: Maybe I'm gonna feel clueless but..... What do you mean by VLAs? Very large arrays? lol
-
caf almost 11 years@CoryGross: A "variable length array", an array type where the length is not an integer constant expression (or the element type is itself a variable length array type).
-
Cory Gross almost 11 years@caf: So your saying
sizeof
can be used on a dynamically allocated array and in this context will not be calculated at compile time? -
caf almost 11 yearsI am saying that in the function
int foo(int n) { int a[n];
the valuesizeof a
is not calculated at compile-time.
-
-
Timothy Jones about 12 yearsThe string literal
"september"
implicitly contains the null character, sostrlen()
will work, if the program hasn't crashed already (due to writing past the end of thestring
array) -
beparas about 12 yearsThis is the test program for understanding the working of sizeof()
-
pmg about 12 yearsNo, no, no.
strncpy()
, despite its name, is the wrong tool to do anything with strings. In the example above, the resultingstring
will not be a string because none of its 8 elements will contain a zero terminator. -
pmg about 12 yearsIt's the wrong tool for strings precisely because it doesn't account for the zero terminator that exists in each and every string by definition (
strncpy()
design makes it useful only for ... errr ... un-terminated strings). Make sure you have space and usestrcpy()
(or, if you can use BSD-isms, usestrlcpy()
). -
Agnius Vasiliauskas about 12 yearsI see thing likes this: both
strcpy
andstrncpy
have vulnerabilities: -strcpy
does not account for buffer overflow. -strncpy
does not account for string terminator. So in my opinion it doesn't matter which version we will use - in any case we must avoid one problem or the other ... -
Dr. Essen about 6 yearsYeah, even after copying "September", its still giving correct length of string despite we don't know the 9th position contains null character or not!
-
ShadowRanger about 3 years@TimothyJones: It's undefined behavior, so technically, there are options besides "crash" or "work". Never discount the possibility of nasal demons.
-
ShadowRanger about 3 years@AgniusVasiliauskas: The old standard, but ugly/verbose, solution is using
snprintf
which writes up ton - 1
characters, and always NUL-terminates. Or if you're able to use C11,strcpy_s
.