Segfault while accessing dynamicly allocated C struct array
I have the following struct that is defined in the following way
typedef struct _abcd {
int a;
unsigned long b;
void (*c)(int);
int d;
} abcd_t, *abcd;
Now i have the following code
static abcd foo
int set_size(int size){
foo = malloc(sizeof(abcd) * size);
}
This code for some reason gives me segfault when accessing some of the properties of array members.
But i have noticed that if i change the malloc line to the following - it fixes the issue
foo = malloc(sizeof(foo[0]) * size);
I find it strange as obviously sizeof(foo[0]) = sizeof(abcd)
So what is exactly the difference here?
Thanks
c malloc dynamic-arrays
add a comment |
I have the following struct that is defined in the following way
typedef struct _abcd {
int a;
unsigned long b;
void (*c)(int);
int d;
} abcd_t, *abcd;
Now i have the following code
static abcd foo
int set_size(int size){
foo = malloc(sizeof(abcd) * size);
}
This code for some reason gives me segfault when accessing some of the properties of array members.
But i have noticed that if i change the malloc line to the following - it fixes the issue
foo = malloc(sizeof(foo[0]) * size);
I find it strange as obviously sizeof(foo[0]) = sizeof(abcd)
So what is exactly the difference here?
Thanks
c malloc dynamic-arrays
add a comment |
I have the following struct that is defined in the following way
typedef struct _abcd {
int a;
unsigned long b;
void (*c)(int);
int d;
} abcd_t, *abcd;
Now i have the following code
static abcd foo
int set_size(int size){
foo = malloc(sizeof(abcd) * size);
}
This code for some reason gives me segfault when accessing some of the properties of array members.
But i have noticed that if i change the malloc line to the following - it fixes the issue
foo = malloc(sizeof(foo[0]) * size);
I find it strange as obviously sizeof(foo[0]) = sizeof(abcd)
So what is exactly the difference here?
Thanks
c malloc dynamic-arrays
I have the following struct that is defined in the following way
typedef struct _abcd {
int a;
unsigned long b;
void (*c)(int);
int d;
} abcd_t, *abcd;
Now i have the following code
static abcd foo
int set_size(int size){
foo = malloc(sizeof(abcd) * size);
}
This code for some reason gives me segfault when accessing some of the properties of array members.
But i have noticed that if i change the malloc line to the following - it fixes the issue
foo = malloc(sizeof(foo[0]) * size);
I find it strange as obviously sizeof(foo[0]) = sizeof(abcd)
So what is exactly the difference here?
Thanks
c malloc dynamic-arrays
c malloc dynamic-arrays
edited Nov 15 '18 at 0:56
Dor Dali
asked Nov 15 '18 at 0:50
Dor DaliDor Dali
235
235
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
obviously
sizeof(foo[0]) = sizeof(abcd)
It is not the same since you typedef
ed abcd
to be a *pointer* to struct _abcd
.
Use
foo = malloc(sizeof(*foo) * size);
to have robust code even if the type of foo
should change at some point.
Your
foo = malloc(sizeof(foo[0]) * size);
is essentially the same since foo[0]
is just syntactic sugar for *(foo + 0)
which becomes *foo
.
add a comment |
The bug is you're allocating sizeof(abcd)
and that's a pointer, not a struct. You want sizeof(abcd_t)
or sizeof(*abcd)
.
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%2f53310928%2fsegfault-while-accessing-dynamicly-allocated-c-struct-array%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
obviously
sizeof(foo[0]) = sizeof(abcd)
It is not the same since you typedef
ed abcd
to be a *pointer* to struct _abcd
.
Use
foo = malloc(sizeof(*foo) * size);
to have robust code even if the type of foo
should change at some point.
Your
foo = malloc(sizeof(foo[0]) * size);
is essentially the same since foo[0]
is just syntactic sugar for *(foo + 0)
which becomes *foo
.
add a comment |
obviously
sizeof(foo[0]) = sizeof(abcd)
It is not the same since you typedef
ed abcd
to be a *pointer* to struct _abcd
.
Use
foo = malloc(sizeof(*foo) * size);
to have robust code even if the type of foo
should change at some point.
Your
foo = malloc(sizeof(foo[0]) * size);
is essentially the same since foo[0]
is just syntactic sugar for *(foo + 0)
which becomes *foo
.
add a comment |
obviously
sizeof(foo[0]) = sizeof(abcd)
It is not the same since you typedef
ed abcd
to be a *pointer* to struct _abcd
.
Use
foo = malloc(sizeof(*foo) * size);
to have robust code even if the type of foo
should change at some point.
Your
foo = malloc(sizeof(foo[0]) * size);
is essentially the same since foo[0]
is just syntactic sugar for *(foo + 0)
which becomes *foo
.
obviously
sizeof(foo[0]) = sizeof(abcd)
It is not the same since you typedef
ed abcd
to be a *pointer* to struct _abcd
.
Use
foo = malloc(sizeof(*foo) * size);
to have robust code even if the type of foo
should change at some point.
Your
foo = malloc(sizeof(foo[0]) * size);
is essentially the same since foo[0]
is just syntactic sugar for *(foo + 0)
which becomes *foo
.
answered Nov 15 '18 at 0:55
SwordfishSwordfish
10.1k11436
10.1k11436
add a comment |
add a comment |
The bug is you're allocating sizeof(abcd)
and that's a pointer, not a struct. You want sizeof(abcd_t)
or sizeof(*abcd)
.
add a comment |
The bug is you're allocating sizeof(abcd)
and that's a pointer, not a struct. You want sizeof(abcd_t)
or sizeof(*abcd)
.
add a comment |
The bug is you're allocating sizeof(abcd)
and that's a pointer, not a struct. You want sizeof(abcd_t)
or sizeof(*abcd)
.
The bug is you're allocating sizeof(abcd)
and that's a pointer, not a struct. You want sizeof(abcd_t)
or sizeof(*abcd)
.
answered Nov 15 '18 at 0:56
John ZwinckJohn Zwinck
153k17177296
153k17177296
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%2f53310928%2fsegfault-while-accessing-dynamicly-allocated-c-struct-array%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