Problem with GCC compiler












1















I am using Arch Linux and when I am compiling and running the following C code,



#include <stdio.h>
#include<string.h>

int main(void) {
char s1="Hello";
char s2="World";

strcat(s1,s2);
int s2_len=strlen(s2);

printf("s1 = %s, s2 = %s and length of s2 = %d.n", s1, s2, s2_len);

return 0;
}


I am getting the output:



s1 = HelloWorld, s2 = orld and length of s2 = 4.


Although the output shoud be s1 = HelloWorld, s2 = World and length of s2 = 5. and it is the output when I am using some online IDE.



Can somebody explain me why is this happening?










share|improve this question













migrated from unix.stackexchange.com 7 hours ago


This question came from our site for users of Linux, FreeBSD and other Un*x-like operating systems.











  • 6





    You are overflowing your s1 causing undefined behavior. The problem is with your code and not the compiler (and this should be your assumption always. The cases where compiler is wrong are extremely rare).

    – Eugene Sh.
    7 hours ago


















1















I am using Arch Linux and when I am compiling and running the following C code,



#include <stdio.h>
#include<string.h>

int main(void) {
char s1="Hello";
char s2="World";

strcat(s1,s2);
int s2_len=strlen(s2);

printf("s1 = %s, s2 = %s and length of s2 = %d.n", s1, s2, s2_len);

return 0;
}


I am getting the output:



s1 = HelloWorld, s2 = orld and length of s2 = 4.


Although the output shoud be s1 = HelloWorld, s2 = World and length of s2 = 5. and it is the output when I am using some online IDE.



Can somebody explain me why is this happening?










share|improve this question













migrated from unix.stackexchange.com 7 hours ago


This question came from our site for users of Linux, FreeBSD and other Un*x-like operating systems.











  • 6





    You are overflowing your s1 causing undefined behavior. The problem is with your code and not the compiler (and this should be your assumption always. The cases where compiler is wrong are extremely rare).

    – Eugene Sh.
    7 hours ago
















1












1








1








I am using Arch Linux and when I am compiling and running the following C code,



#include <stdio.h>
#include<string.h>

int main(void) {
char s1="Hello";
char s2="World";

strcat(s1,s2);
int s2_len=strlen(s2);

printf("s1 = %s, s2 = %s and length of s2 = %d.n", s1, s2, s2_len);

return 0;
}


I am getting the output:



s1 = HelloWorld, s2 = orld and length of s2 = 4.


Although the output shoud be s1 = HelloWorld, s2 = World and length of s2 = 5. and it is the output when I am using some online IDE.



Can somebody explain me why is this happening?










share|improve this question














I am using Arch Linux and when I am compiling and running the following C code,



#include <stdio.h>
#include<string.h>

int main(void) {
char s1="Hello";
char s2="World";

strcat(s1,s2);
int s2_len=strlen(s2);

printf("s1 = %s, s2 = %s and length of s2 = %d.n", s1, s2, s2_len);

return 0;
}


I am getting the output:



s1 = HelloWorld, s2 = orld and length of s2 = 4.


Although the output shoud be s1 = HelloWorld, s2 = World and length of s2 = 5. and it is the output when I am using some online IDE.



Can somebody explain me why is this happening?







string c






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 7 hours ago









xyzxyz

112




112




migrated from unix.stackexchange.com 7 hours ago


This question came from our site for users of Linux, FreeBSD and other Un*x-like operating systems.






migrated from unix.stackexchange.com 7 hours ago


This question came from our site for users of Linux, FreeBSD and other Un*x-like operating systems.










  • 6





    You are overflowing your s1 causing undefined behavior. The problem is with your code and not the compiler (and this should be your assumption always. The cases where compiler is wrong are extremely rare).

    – Eugene Sh.
    7 hours ago
















  • 6





    You are overflowing your s1 causing undefined behavior. The problem is with your code and not the compiler (and this should be your assumption always. The cases where compiler is wrong are extremely rare).

    – Eugene Sh.
    7 hours ago










6




6





You are overflowing your s1 causing undefined behavior. The problem is with your code and not the compiler (and this should be your assumption always. The cases where compiler is wrong are extremely rare).

– Eugene Sh.
7 hours ago







You are overflowing your s1 causing undefined behavior. The problem is with your code and not the compiler (and this should be your assumption always. The cases where compiler is wrong are extremely rare).

– Eugene Sh.
7 hours ago














1 Answer
1






active

oldest

votes


















8














char s1="Hello";
char s2="World";

strcat(s1,s2);


The variable declarations allocate memory for 5 characters each, plus the terminating NUL byte. Your strcat call writes past that space, which produces undefined results.



In this case, the memory layout is probably something like this



0 1 2 3 4  5 6 7 8 9 10 11
H e l l o W o r l d
^ ^
s1 s2


After the strcat, the result is:



0 1 2 3 4 5 6 7 8 9 10 11
H e l l o W o r l d
^ ^
s1 s2


Which gives the result you see. Note that there could be other possible results, the program could e.g. crash at the strcat call.






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54256872%2fproblem-with-gcc-compiler%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    8














    char s1="Hello";
    char s2="World";

    strcat(s1,s2);


    The variable declarations allocate memory for 5 characters each, plus the terminating NUL byte. Your strcat call writes past that space, which produces undefined results.



    In this case, the memory layout is probably something like this



    0 1 2 3 4  5 6 7 8 9 10 11
    H e l l o W o r l d
    ^ ^
    s1 s2


    After the strcat, the result is:



    0 1 2 3 4 5 6 7 8 9 10 11
    H e l l o W o r l d
    ^ ^
    s1 s2


    Which gives the result you see. Note that there could be other possible results, the program could e.g. crash at the strcat call.






    share|improve this answer




























      8














      char s1="Hello";
      char s2="World";

      strcat(s1,s2);


      The variable declarations allocate memory for 5 characters each, plus the terminating NUL byte. Your strcat call writes past that space, which produces undefined results.



      In this case, the memory layout is probably something like this



      0 1 2 3 4  5 6 7 8 9 10 11
      H e l l o W o r l d
      ^ ^
      s1 s2


      After the strcat, the result is:



      0 1 2 3 4 5 6 7 8 9 10 11
      H e l l o W o r l d
      ^ ^
      s1 s2


      Which gives the result you see. Note that there could be other possible results, the program could e.g. crash at the strcat call.






      share|improve this answer


























        8












        8








        8







        char s1="Hello";
        char s2="World";

        strcat(s1,s2);


        The variable declarations allocate memory for 5 characters each, plus the terminating NUL byte. Your strcat call writes past that space, which produces undefined results.



        In this case, the memory layout is probably something like this



        0 1 2 3 4  5 6 7 8 9 10 11
        H e l l o W o r l d
        ^ ^
        s1 s2


        After the strcat, the result is:



        0 1 2 3 4 5 6 7 8 9 10 11
        H e l l o W o r l d
        ^ ^
        s1 s2


        Which gives the result you see. Note that there could be other possible results, the program could e.g. crash at the strcat call.






        share|improve this answer













        char s1="Hello";
        char s2="World";

        strcat(s1,s2);


        The variable declarations allocate memory for 5 characters each, plus the terminating NUL byte. Your strcat call writes past that space, which produces undefined results.



        In this case, the memory layout is probably something like this



        0 1 2 3 4  5 6 7 8 9 10 11
        H e l l o W o r l d
        ^ ^
        s1 s2


        After the strcat, the result is:



        0 1 2 3 4 5 6 7 8 9 10 11
        H e l l o W o r l d
        ^ ^
        s1 s2


        Which gives the result you see. Note that there could be other possible results, the program could e.g. crash at the strcat call.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 7 hours ago









        ilkkachuilkkachu

        3,509318




        3,509318






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54256872%2fproblem-with-gcc-compiler%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Loup dans la culture

            How to solve the problem of ntp “Unable to contact time server” from KDE?

            ASUS Zenbook UX433/UX333 — Configure Touchpad-embedded numpad on Linux