expand array of struct using realloc C












-1















I'm trying to expand the size of my array by 1 every time when I Enqueue

a new student , and it did work but the problem is it takes a garbage values for the name and id , can you please help me why is this happening ,
thanks .



 void Enqueue(Student *arr ,  int index){


Student *s = NULL ;
int size = index + 1 ;
Student *temp = (Student*)realloc(s, size*(sizeof(Student)) );

if (temp == NULL){
printf("Can not allocate memory !!! n") ;
return ;
}
else
arr = temp ;


char Name[10] ; int Id ;

printf("please enter student name : n");
scanf("%s" , Name);
arr[size].name = Name ;

printf("please enter student ID : n");
scanf("%d" , &Id);
arr[size].id = Id ;


return ;

}


this is the run :



Student(5) Name :H�� H9�u�H�AA]A^A_Ðf. � 
Student(5) ID : 1









share|improve this question























  • Can we please have Student?

    – Tsakiroglou Fotis
    Nov 15 '18 at 11:54






  • 2





    Regarding arr[size].name = Name; - If this compiles, then Student::Name can only be one of two things: void* or char* (the latter far more likely). That means you're retaining a pointer to an automatic local variable Name in this function, which will produce undefined behavior the moment it is dereferenced outside this function. You need a real buffer (dynamic or fixed in the Student structure) and strcpy (or scan directly into the target). And no, it's not the only bug.

    – WhozCraig
    Nov 15 '18 at 11:56


















-1















I'm trying to expand the size of my array by 1 every time when I Enqueue

a new student , and it did work but the problem is it takes a garbage values for the name and id , can you please help me why is this happening ,
thanks .



 void Enqueue(Student *arr ,  int index){


Student *s = NULL ;
int size = index + 1 ;
Student *temp = (Student*)realloc(s, size*(sizeof(Student)) );

if (temp == NULL){
printf("Can not allocate memory !!! n") ;
return ;
}
else
arr = temp ;


char Name[10] ; int Id ;

printf("please enter student name : n");
scanf("%s" , Name);
arr[size].name = Name ;

printf("please enter student ID : n");
scanf("%d" , &Id);
arr[size].id = Id ;


return ;

}


this is the run :



Student(5) Name :H�� H9�u�H�AA]A^A_Ðf. � 
Student(5) ID : 1









share|improve this question























  • Can we please have Student?

    – Tsakiroglou Fotis
    Nov 15 '18 at 11:54






  • 2





    Regarding arr[size].name = Name; - If this compiles, then Student::Name can only be one of two things: void* or char* (the latter far more likely). That means you're retaining a pointer to an automatic local variable Name in this function, which will produce undefined behavior the moment it is dereferenced outside this function. You need a real buffer (dynamic or fixed in the Student structure) and strcpy (or scan directly into the target). And no, it's not the only bug.

    – WhozCraig
    Nov 15 '18 at 11:56
















-1












-1








-1








I'm trying to expand the size of my array by 1 every time when I Enqueue

a new student , and it did work but the problem is it takes a garbage values for the name and id , can you please help me why is this happening ,
thanks .



 void Enqueue(Student *arr ,  int index){


Student *s = NULL ;
int size = index + 1 ;
Student *temp = (Student*)realloc(s, size*(sizeof(Student)) );

if (temp == NULL){
printf("Can not allocate memory !!! n") ;
return ;
}
else
arr = temp ;


char Name[10] ; int Id ;

printf("please enter student name : n");
scanf("%s" , Name);
arr[size].name = Name ;

printf("please enter student ID : n");
scanf("%d" , &Id);
arr[size].id = Id ;


return ;

}


this is the run :



Student(5) Name :H�� H9�u�H�AA]A^A_Ðf. � 
Student(5) ID : 1









share|improve this question














I'm trying to expand the size of my array by 1 every time when I Enqueue

a new student , and it did work but the problem is it takes a garbage values for the name and id , can you please help me why is this happening ,
thanks .



 void Enqueue(Student *arr ,  int index){


Student *s = NULL ;
int size = index + 1 ;
Student *temp = (Student*)realloc(s, size*(sizeof(Student)) );

if (temp == NULL){
printf("Can not allocate memory !!! n") ;
return ;
}
else
arr = temp ;


char Name[10] ; int Id ;

printf("please enter student name : n");
scanf("%s" , Name);
arr[size].name = Name ;

printf("please enter student ID : n");
scanf("%d" , &Id);
arr[size].id = Id ;


return ;

}


this is the run :



Student(5) Name :H�� H9�u�H�AA]A^A_Ðf. � 
Student(5) ID : 1






c






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 15 '18 at 11:51









CsprogCsprog

13




13













  • Can we please have Student?

    – Tsakiroglou Fotis
    Nov 15 '18 at 11:54






  • 2





    Regarding arr[size].name = Name; - If this compiles, then Student::Name can only be one of two things: void* or char* (the latter far more likely). That means you're retaining a pointer to an automatic local variable Name in this function, which will produce undefined behavior the moment it is dereferenced outside this function. You need a real buffer (dynamic or fixed in the Student structure) and strcpy (or scan directly into the target). And no, it's not the only bug.

    – WhozCraig
    Nov 15 '18 at 11:56





















  • Can we please have Student?

    – Tsakiroglou Fotis
    Nov 15 '18 at 11:54






  • 2





    Regarding arr[size].name = Name; - If this compiles, then Student::Name can only be one of two things: void* or char* (the latter far more likely). That means you're retaining a pointer to an automatic local variable Name in this function, which will produce undefined behavior the moment it is dereferenced outside this function. You need a real buffer (dynamic or fixed in the Student structure) and strcpy (or scan directly into the target). And no, it's not the only bug.

    – WhozCraig
    Nov 15 '18 at 11:56



















Can we please have Student?

– Tsakiroglou Fotis
Nov 15 '18 at 11:54





Can we please have Student?

– Tsakiroglou Fotis
Nov 15 '18 at 11:54




2




2





Regarding arr[size].name = Name; - If this compiles, then Student::Name can only be one of two things: void* or char* (the latter far more likely). That means you're retaining a pointer to an automatic local variable Name in this function, which will produce undefined behavior the moment it is dereferenced outside this function. You need a real buffer (dynamic or fixed in the Student structure) and strcpy (or scan directly into the target). And no, it's not the only bug.

– WhozCraig
Nov 15 '18 at 11:56







Regarding arr[size].name = Name; - If this compiles, then Student::Name can only be one of two things: void* or char* (the latter far more likely). That means you're retaining a pointer to an automatic local variable Name in this function, which will produce undefined behavior the moment it is dereferenced outside this function. You need a real buffer (dynamic or fixed in the Student structure) and strcpy (or scan directly into the target). And no, it's not the only bug.

– WhozCraig
Nov 15 '18 at 11:56














1 Answer
1






active

oldest

votes


















1














realloc(s, size*(sizeof(Student)) ); must be realloc(arr, size*(sizeof(Student)) ); (s is NULL!).



Then, you never return the newly allocated array to the caller:



arr = temp does not change the passed in pointer. You'd need a pointer to a pointer to return the new value, like



void Enqueue(Student **arr ,  int index){
...
*arr = temp;
...
}


or just return the new array:



Student* Enqueue(Student *arr, int index) {
...
return temp;
}


And then there are the other memory management bugs, as mentioned by @WhozCraig.






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%2f53318873%2fexpand-array-of-struct-using-realloc-c%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









    1














    realloc(s, size*(sizeof(Student)) ); must be realloc(arr, size*(sizeof(Student)) ); (s is NULL!).



    Then, you never return the newly allocated array to the caller:



    arr = temp does not change the passed in pointer. You'd need a pointer to a pointer to return the new value, like



    void Enqueue(Student **arr ,  int index){
    ...
    *arr = temp;
    ...
    }


    or just return the new array:



    Student* Enqueue(Student *arr, int index) {
    ...
    return temp;
    }


    And then there are the other memory management bugs, as mentioned by @WhozCraig.






    share|improve this answer






























      1














      realloc(s, size*(sizeof(Student)) ); must be realloc(arr, size*(sizeof(Student)) ); (s is NULL!).



      Then, you never return the newly allocated array to the caller:



      arr = temp does not change the passed in pointer. You'd need a pointer to a pointer to return the new value, like



      void Enqueue(Student **arr ,  int index){
      ...
      *arr = temp;
      ...
      }


      or just return the new array:



      Student* Enqueue(Student *arr, int index) {
      ...
      return temp;
      }


      And then there are the other memory management bugs, as mentioned by @WhozCraig.






      share|improve this answer




























        1












        1








        1







        realloc(s, size*(sizeof(Student)) ); must be realloc(arr, size*(sizeof(Student)) ); (s is NULL!).



        Then, you never return the newly allocated array to the caller:



        arr = temp does not change the passed in pointer. You'd need a pointer to a pointer to return the new value, like



        void Enqueue(Student **arr ,  int index){
        ...
        *arr = temp;
        ...
        }


        or just return the new array:



        Student* Enqueue(Student *arr, int index) {
        ...
        return temp;
        }


        And then there are the other memory management bugs, as mentioned by @WhozCraig.






        share|improve this answer















        realloc(s, size*(sizeof(Student)) ); must be realloc(arr, size*(sizeof(Student)) ); (s is NULL!).



        Then, you never return the newly allocated array to the caller:



        arr = temp does not change the passed in pointer. You'd need a pointer to a pointer to return the new value, like



        void Enqueue(Student **arr ,  int index){
        ...
        *arr = temp;
        ...
        }


        or just return the new array:



        Student* Enqueue(Student *arr, int index) {
        ...
        return temp;
        }


        And then there are the other memory management bugs, as mentioned by @WhozCraig.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 15 '18 at 12:01

























        answered Nov 15 '18 at 11:55









        JimmyBJimmyB

        9,53811838




        9,53811838
































            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%2f53318873%2fexpand-array-of-struct-using-realloc-c%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

            Xamarin.iOS Cant Deploy on Iphone

            Glorious Revolution

            Dulmage-Mendelsohn matrix decomposition in Python