expand array of struct using realloc C
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
add a comment |
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
Can we please have Student?
– Tsakiroglou Fotis
Nov 15 '18 at 11:54
2
Regardingarr[size].name = Name;
- If this compiles, thenStudent::Name
can only be one of two things:void*
orchar*
(the latter far more likely). That means you're retaining a pointer to an automatic local variableName
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 theStudent
structure) andstrcpy
(or scan directly into the target). And no, it's not the only bug.
– WhozCraig
Nov 15 '18 at 11:56
add a comment |
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
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
c
asked Nov 15 '18 at 11:51
CsprogCsprog
13
13
Can we please have Student?
– Tsakiroglou Fotis
Nov 15 '18 at 11:54
2
Regardingarr[size].name = Name;
- If this compiles, thenStudent::Name
can only be one of two things:void*
orchar*
(the latter far more likely). That means you're retaining a pointer to an automatic local variableName
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 theStudent
structure) andstrcpy
(or scan directly into the target). And no, it's not the only bug.
– WhozCraig
Nov 15 '18 at 11:56
add a comment |
Can we please have Student?
– Tsakiroglou Fotis
Nov 15 '18 at 11:54
2
Regardingarr[size].name = Name;
- If this compiles, thenStudent::Name
can only be one of two things:void*
orchar*
(the latter far more likely). That means you're retaining a pointer to an automatic local variableName
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 theStudent
structure) andstrcpy
(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
add a comment |
1 Answer
1
active
oldest
votes
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.
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
add a comment |
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.
add a comment |
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.
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.
edited Nov 15 '18 at 12:01
answered Nov 15 '18 at 11:55
JimmyBJimmyB
9,53811838
9,53811838
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
Can we please have Student?
– Tsakiroglou Fotis
Nov 15 '18 at 11:54
2
Regarding
arr[size].name = Name;
- If this compiles, thenStudent::Name
can only be one of two things:void*
orchar*
(the latter far more likely). That means you're retaining a pointer to an automatic local variableName
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 theStudent
structure) andstrcpy
(or scan directly into the target). And no, it's not the only bug.– WhozCraig
Nov 15 '18 at 11:56