Sizeof vs Strlen

55,519

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

Share:
55,519

Related videos on Youtube

beparas
Author by

beparas

Updated on July 09, 2022

Comments

  • beparas
    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
      Marlon about 12 years
      You 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 call strcpy, 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
      Kiran Kumar about 12 years
      Note that sizeof is calculated at compile time where as strlen is run time.
    • caf
      caf about 12 years
      @Naveen: Be aware that that is not necessarily true where VLAs are involved.
    • Cory Gross
      Cory Gross almost 11 years
      @caf: Maybe I'm gonna feel clueless but..... What do you mean by VLAs? Very large arrays? lol
    • caf
      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
      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
      caf almost 11 years
      I am saying that in the function int foo(int n) { int a[n]; the value sizeof a is not calculated at compile-time.
  • Timothy Jones
    Timothy Jones about 12 years
    The string literal "september" implicitly contains the null character, so strlen() will work, if the program hasn't crashed already (due to writing past the end of the string array)
  • beparas
    beparas about 12 years
    This is the test program for understanding the working of sizeof()
  • pmg
    pmg about 12 years
    No, no, no. strncpy(), despite its name, is the wrong tool to do anything with strings. In the example above, the resulting string will not be a string because none of its 8 elements will contain a zero terminator.
  • pmg
    pmg about 12 years
    It'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 use strcpy() (or, if you can use BSD-isms, use strlcpy()).
  • Agnius Vasiliauskas
    Agnius Vasiliauskas about 12 years
    I see thing likes this: both strcpy and strncpy 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
    Dr. Essen about 6 years
    Yeah, 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
    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
    ShadowRanger about 3 years
    @AgniusVasiliauskas: The old standard, but ugly/verbose, solution is using snprintf which writes up to n - 1 characters, and always NUL-terminates. Or if you're able to use C11, strcpy_s.