How to write to a void pointer without knowing the Data Type?
I am trying to write the code for a generic Stack using Singly Linked List in C. I am trying to use (void *)
as the data type in each of its functions like:
node* getNode(void *, size_t);
void append(node **, size_t);
etc.
The structure for each node is:
typedef struct linked_list{
void *data;
struct linked_list *next; }node;
In the getNode
function mentioned above I am trying to do this:
node* getNode(void *data, size_t data_size) {
node *newNode;
newNode = (node *)malloc(sizeof(node));
newNode->next = NULL;
// this line should assign the void *data to the data part of the node
return newNode;}
I could not find how to assign the data part without knowing the data type, but only using the data_size
variable. I found out about the memcopy
function, but even that requires the data type.
Please help.
c adt dynamic-memory-allocation void-pointers
add a comment |
I am trying to write the code for a generic Stack using Singly Linked List in C. I am trying to use (void *)
as the data type in each of its functions like:
node* getNode(void *, size_t);
void append(node **, size_t);
etc.
The structure for each node is:
typedef struct linked_list{
void *data;
struct linked_list *next; }node;
In the getNode
function mentioned above I am trying to do this:
node* getNode(void *data, size_t data_size) {
node *newNode;
newNode = (node *)malloc(sizeof(node));
newNode->next = NULL;
// this line should assign the void *data to the data part of the node
return newNode;}
I could not find how to assign the data part without knowing the data type, but only using the data_size
variable. I found out about the memcopy
function, but even that requires the data type.
Please help.
c adt dynamic-memory-allocation void-pointers
add a comment |
I am trying to write the code for a generic Stack using Singly Linked List in C. I am trying to use (void *)
as the data type in each of its functions like:
node* getNode(void *, size_t);
void append(node **, size_t);
etc.
The structure for each node is:
typedef struct linked_list{
void *data;
struct linked_list *next; }node;
In the getNode
function mentioned above I am trying to do this:
node* getNode(void *data, size_t data_size) {
node *newNode;
newNode = (node *)malloc(sizeof(node));
newNode->next = NULL;
// this line should assign the void *data to the data part of the node
return newNode;}
I could not find how to assign the data part without knowing the data type, but only using the data_size
variable. I found out about the memcopy
function, but even that requires the data type.
Please help.
c adt dynamic-memory-allocation void-pointers
I am trying to write the code for a generic Stack using Singly Linked List in C. I am trying to use (void *)
as the data type in each of its functions like:
node* getNode(void *, size_t);
void append(node **, size_t);
etc.
The structure for each node is:
typedef struct linked_list{
void *data;
struct linked_list *next; }node;
In the getNode
function mentioned above I am trying to do this:
node* getNode(void *data, size_t data_size) {
node *newNode;
newNode = (node *)malloc(sizeof(node));
newNode->next = NULL;
// this line should assign the void *data to the data part of the node
return newNode;}
I could not find how to assign the data part without knowing the data type, but only using the data_size
variable. I found out about the memcopy
function, but even that requires the data type.
Please help.
c adt dynamic-memory-allocation void-pointers
c adt dynamic-memory-allocation void-pointers
asked Nov 13 '18 at 2:59
The ViperThe Viper
7810
7810
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
If you only want to save a pointer to the data, you can just copy the pointer:
newNode->data = data;
If you want to copy what it points to, you need malloc
to get the memory and memcpy
to copy the bytes:
newNode->data = malloc(data_size);
memcpy(newNode->data, data, data_size);
The signature of memcpy
is:
void *memcpy(void *dest, const void *src, size_t n);
It's meant to copy generic memory, so you can pass it a void *
for both the source and destination.
Doesn'tmemcpy
require data type?
– The Viper
Nov 13 '18 at 3:46
@TheViper No, just a pointer.
– dbush
Nov 13 '18 at 3:47
okay, thank you @dbush
– The Viper
Nov 13 '18 at 3:48
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%2f53273150%2fhow-to-write-to-a-void-pointer-without-knowing-the-data-type%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
If you only want to save a pointer to the data, you can just copy the pointer:
newNode->data = data;
If you want to copy what it points to, you need malloc
to get the memory and memcpy
to copy the bytes:
newNode->data = malloc(data_size);
memcpy(newNode->data, data, data_size);
The signature of memcpy
is:
void *memcpy(void *dest, const void *src, size_t n);
It's meant to copy generic memory, so you can pass it a void *
for both the source and destination.
Doesn'tmemcpy
require data type?
– The Viper
Nov 13 '18 at 3:46
@TheViper No, just a pointer.
– dbush
Nov 13 '18 at 3:47
okay, thank you @dbush
– The Viper
Nov 13 '18 at 3:48
add a comment |
If you only want to save a pointer to the data, you can just copy the pointer:
newNode->data = data;
If you want to copy what it points to, you need malloc
to get the memory and memcpy
to copy the bytes:
newNode->data = malloc(data_size);
memcpy(newNode->data, data, data_size);
The signature of memcpy
is:
void *memcpy(void *dest, const void *src, size_t n);
It's meant to copy generic memory, so you can pass it a void *
for both the source and destination.
Doesn'tmemcpy
require data type?
– The Viper
Nov 13 '18 at 3:46
@TheViper No, just a pointer.
– dbush
Nov 13 '18 at 3:47
okay, thank you @dbush
– The Viper
Nov 13 '18 at 3:48
add a comment |
If you only want to save a pointer to the data, you can just copy the pointer:
newNode->data = data;
If you want to copy what it points to, you need malloc
to get the memory and memcpy
to copy the bytes:
newNode->data = malloc(data_size);
memcpy(newNode->data, data, data_size);
The signature of memcpy
is:
void *memcpy(void *dest, const void *src, size_t n);
It's meant to copy generic memory, so you can pass it a void *
for both the source and destination.
If you only want to save a pointer to the data, you can just copy the pointer:
newNode->data = data;
If you want to copy what it points to, you need malloc
to get the memory and memcpy
to copy the bytes:
newNode->data = malloc(data_size);
memcpy(newNode->data, data, data_size);
The signature of memcpy
is:
void *memcpy(void *dest, const void *src, size_t n);
It's meant to copy generic memory, so you can pass it a void *
for both the source and destination.
answered Nov 13 '18 at 3:02
dbushdbush
94.6k12101136
94.6k12101136
Doesn'tmemcpy
require data type?
– The Viper
Nov 13 '18 at 3:46
@TheViper No, just a pointer.
– dbush
Nov 13 '18 at 3:47
okay, thank you @dbush
– The Viper
Nov 13 '18 at 3:48
add a comment |
Doesn'tmemcpy
require data type?
– The Viper
Nov 13 '18 at 3:46
@TheViper No, just a pointer.
– dbush
Nov 13 '18 at 3:47
okay, thank you @dbush
– The Viper
Nov 13 '18 at 3:48
Doesn't
memcpy
require data type?– The Viper
Nov 13 '18 at 3:46
Doesn't
memcpy
require data type?– The Viper
Nov 13 '18 at 3:46
@TheViper No, just a pointer.
– dbush
Nov 13 '18 at 3:47
@TheViper No, just a pointer.
– dbush
Nov 13 '18 at 3:47
okay, thank you @dbush
– The Viper
Nov 13 '18 at 3:48
okay, thank you @dbush
– The Viper
Nov 13 '18 at 3:48
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%2f53273150%2fhow-to-write-to-a-void-pointer-without-knowing-the-data-type%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