473,218 Members | 1,824 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,218 software developers and data experts.

Casting a generic or void pointer to point to a struct...

First, I would thank all of those that took the time to answer my
question about creating an array based on a numeric value stored in a
variable.

I realize after reading the responses and doing some more research,
that what I really need is known in C as a "dynamic array". Basically,
you surpass the array notation and use pointers with memory obtained
with malloc() or calloc(). I think this will do just what I needed.

That has brought up another question though. I'm not sure what syntax I
would use to cast a gneeric or void pointer to a struct that I have
defined. For example, if I have defined the "new_data_type" struct
previously in the source code file, would the following code be valid?

/* Create a generic pointer to the first element in the block of
memory obtained with the calloc() function. */
void generic_pointer = calloc(number_of_elements, size_of_element);

/* If the memory has been sucessfully allocated, cast the generic
pointer to the correct data type. */
if(generic_pointer != NULL)
(struct new_data_type *)generic_pointer
else
/* We've got problems. */

Thanks again for the help everyone.

Scott Huey

Aug 1 '06 #1
11 4642
MQ

re****************@gmail.com wrote:
First, I would thank all of those that took the time to answer my
question about creating an array based on a numeric value stored in a
variable.

I realize after reading the responses and doing some more research,
that what I really need is known in C as a "dynamic array". Basically,
you surpass the array notation and use pointers with memory obtained
with malloc() or calloc(). I think this will do just what I needed.

That has brought up another question though. I'm not sure what syntax I
would use to cast a gneeric or void pointer to a struct that I have
defined. For example, if I have defined the "new_data_type" struct
previously in the source code file, would the following code be valid?

/* Create a generic pointer to the first element in the block of
memory obtained with the calloc() function. */
void generic_pointer = calloc(number_of_elements, size_of_element);

/* If the memory has been sucessfully allocated, cast the generic
pointer to the correct data type. */
if(generic_pointer != NULL)
(struct new_data_type *)generic_pointer
else
/* We've got problems. */

Thanks again for the help everyone.

Scott Huey
struct new_data_type * ptr = calloc(number_of_elements,
size_of_element);
if(ptr == NULL)
{
/*error */
}
else
{
/*do something */
}

MQ

Aug 1 '06 #2
MQ

MQ wrote:
re****************@gmail.com wrote:
First, I would thank all of those that took the time to answer my
question about creating an array based on a numeric value stored in a
variable.

I realize after reading the responses and doing some more research,
that what I really need is known in C as a "dynamic array". Basically,
you surpass the array notation and use pointers with memory obtained
with malloc() or calloc(). I think this will do just what I needed.

That has brought up another question though. I'm not sure what syntax I
would use to cast a gneeric or void pointer to a struct that I have
defined. For example, if I have defined the "new_data_type" struct
previously in the source code file, would the following code be valid?

/* Create a generic pointer to the first element in the block of
memory obtained with the calloc() function. */
void generic_pointer = calloc(number_of_elements, size_of_element);

/* If the memory has been sucessfully allocated, cast the generic
pointer to the correct data type. */
if(generic_pointer != NULL)
(struct new_data_type *)generic_pointer
else
/* We've got problems. */

Thanks again for the help everyone.

Scott Huey

struct new_data_type * ptr = calloc(number_of_elements,
size_of_element);
if(ptr == NULL)
{
/*error */
}
else
{
/*do something */
}

MQ

correction: size_of_element should be replaced by sizeof(struct
new_data_type)

MQ

Aug 1 '06 #3
re****************@gmail.com writes:
First, I would thank all of those that took the time to answer my
question about creating an array based on a numeric value stored in a
variable.

I realize after reading the responses and doing some more research,
that what I really need is known in C as a "dynamic array". Basically,
you surpass the array notation and use pointers with memory obtained
with malloc() or calloc(). I think this will do just what I needed.

That has brought up another question though. I'm not sure what syntax I
would use to cast a gneeric or void pointer to a struct that I have
defined. For example, if I have defined the "new_data_type" struct
previously in the source code file, would the following code be valid?

/* Create a generic pointer to the first element in the block of
memory obtained with the calloc() function. */
void generic_pointer = calloc(number_of_elements, size_of_element);

/* If the memory has been sucessfully allocated, cast the generic
pointer to the correct data type. */
if(generic_pointer != NULL)
(struct new_data_type *)generic_pointer
else
/* We've got problems. */
Don't cast the result of malloc() or calloc(). It's unnecessary, and
it can mask certain errors.

BTW, it's "void *generic_pointer", not "void generic_pointer".

Also, keep in mind that calloc() isn't necessarily as useful as you
might think it is. It initializes the allocated memory to
all-bits-zero. For pointers or floating-point data, this is not
necessarily meaningful; there's no guarantee that either a null
pointer or a floating-point 0.0 is represented as all-bits-zero.

Usually it's easier to use malloc() (which doesn't initialize the
allocated object), and just make sure that you don't use any portion
of the object that you haven't assigned a value to.

Why do you want a generic pointer rather than a pointer to your
"new_data_type" struct? For example:

struct new_data_type {
/* member declarations here */
};

struct new_data_type *ptr;

ptr = malloc(number_of_elements * sizeof *ptr);

Sometimes you do need to use void* pointers, but quite often it's
better to use a specific pointer type.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Aug 1 '06 #4
MQ wrote:
MQ wrote:
>re****************@gmail.com wrote:
>>First, I would thank all of those that took the time to answer my
question about creating an array based on a numeric value stored in a
variable.

I realize after reading the responses and doing some more research,
that what I really need is known in C as a "dynamic array". Basically,
you surpass the array notation and use pointers with memory obtained
with malloc() or calloc(). I think this will do just what I needed.

That has brought up another question though. I'm not sure what syntax I
would use to cast a gneeric or void pointer to a struct that I have
defined. For example, if I have defined the "new_data_type" struct
previously in the source code file, would the following code be valid?

/* Create a generic pointer to the first element in the block of
memory obtained with the calloc() function. */
void generic_pointer = calloc(number_of_elements, size_of_element);

/* If the memory has been sucessfully allocated, cast the generic
pointer to the correct data type. */
if(generic_pointer != NULL)
(struct new_data_type *)generic_pointer
else
/* We've got problems. */

Thanks again for the help everyone.

Scott Huey
struct new_data_type * ptr = calloc(number_of_elements,
size_of_element);
if(ptr == NULL)
{
/*error */
}
else
{
/*do something */
}

correction: size_of_element should be replaced by sizeof(struct
new_data_type)

In all probability neither is optimal. Firstly, the OP did not say that
it needed clearing to all bits 0 (remember that floating point 0 and
null pointers might not be all bits 0) so why pay the cost of zeroing
the memory? Secondly, there are better ways to use sizeof.

If you really do want calloc:

T *ptr = calloc(number_of_elements, sizeof *ptr);
Then you only have to specify the type in one place, so maintenance is
easier.

Or, for malloc
T *ptr = malloc(number_of_elements * sizeof *ptr);

Or, if mallocing some time after declaration:
ptr = malloc(number_of_elements * sizeof *ptr);

Although the OP should also look up the references to the struct hack
others have posted and, if using a C99 compiler, the C99 sanctioned
alternative.
--
Flash Gordon
Still sigless on this computer.
Aug 1 '06 #5
On Wed, 02 Aug 2006 02:00:42 +0200, Flash Gordon wrote:
<snip>
If you really do want calloc:

T *ptr = calloc(number_of_elements, sizeof *ptr); Then you only have to
specify the type in one place, so maintenance is easier.

Or, for malloc
T *ptr = malloc(number_of_elements * sizeof *ptr);
calloc() might have the benefit of overflow detection.

Aug 2 '06 #6
MQ

Flash Gordon wrote:
>
In all probability neither is optimal. Firstly, the OP did not say that
it needed clearing to all bits 0 (remember that floating point 0 and
null pointers might not be all bits 0) so why pay the cost of zeroing
the memory?
I don't understand what you are talking about

MQ

Aug 2 '06 #7
MQ

Flash Gordon wrote:
>
In all probability neither is optimal. Firstly, the OP did not say that
it needed clearing to all bits 0 (remember that floating point 0 and
null pointers might not be all bits 0) so why pay the cost of zeroing
the memory?
Ah, OK just realized, calloc zeroes memory, malloc does not. I used
calloc because thats what the OP is using, so you have to assume they
are using it for a reason. Why would you use it otherwise?
Secondly, there are better ways to use sizeof.
sizeof *ptr
I dont understand how this is better though. Please explain.

MQ

Aug 2 '06 #8
"MQ" <mi**************@gmail.comwrites:
Flash Gordon wrote:
>In all probability neither is optimal. Firstly, the OP did not say that
it needed clearing to all bits 0 (remember that floating point 0 and
null pointers might not be all bits 0) so why pay the cost of zeroing
the memory?

I don't understand what you are talking about
I don't understand what the problem is.

The main difference between malloc() and calloc() is that calloc()
initializes the allocated object to all-bits-zero. There's no
guarantee that this is useful; all-bits-zero may not be a
representation of a meaningful value for all types. In particular,
there's no guarantee that either a null pointer value or a
floating-point 0.0 is represented as all-bits-zero.

Because of this, zeroing allocated memory is often a waste of time. A
better solution is often to allocate using malloc(), and then be
careful not to read any portion of the allocated object that you
haven't explicitly assigned a value to.

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Aug 2 '06 #9
MQ wrote:
Flash Gordon wrote:
>In all probability neither is optimal. Firstly, the OP did not say that
it needed clearing to all bits 0 (remember that floating point 0 and
null pointers might not be all bits 0) so why pay the cost of zeroing
the memory?

Ah, OK just realized, calloc zeroes memory, malloc does not. I used
calloc because thats what the OP is using, so you have to assume they
are using it for a reason. Why would you use it otherwise?
Because the OP does not know how to program in C yet.
>Secondly, there are better ways to use sizeof.
sizeof *ptr

I dont understand how this is better though. Please explain.
What changes to you have to make to
ptr = malloc(N * sizeof *ptr);
if the type of ptr is changed? I'll give you a clue, the answer is none.

Do you have to find the declaration of ptr to see if the correct amount
of memory is being allocated?

Seach the groups archives for a bit for further discussion.
--
Flash Gordon
Still sigless on this computer
Aug 2 '06 #10
I want to thank all the participants on this thread for their
discussion and responses to the original post.

I realize after reading the responses that I do want to use malloc()
and not calloc().

I am trying to create a "standard" dynamic array structure that can be
used dynamically with a variety of data types. I want programmers to be
able to use this dynamic array through its public functions, without
the need to modify its source code. That is why I was avoiding a call
to sizeof() and using void pointers in my code.

I'm still not sure if what I want to do is possible in C, but your
comments have helped me along in the right direction. I'm sure I'll get
things figured out after I have some more time to spend with the code.

Scott Huey

Flash Gordon wrote:
MQ wrote:
Flash Gordon wrote:
In all probability neither is optimal. Firstly, the OP did not say that
it needed clearing to all bits 0 (remember that floating point 0 and
null pointers might not be all bits 0) so why pay the cost of zeroing
the memory?
Ah, OK just realized, calloc zeroes memory, malloc does not. I used
calloc because thats what the OP is using, so you have to assume they
are using it for a reason. Why would you use it otherwise?

Because the OP does not know how to program in C yet.
Secondly, there are better ways to use sizeof.
sizeof *ptr
I dont understand how this is better though. Please explain.

What changes to you have to make to
ptr = malloc(N * sizeof *ptr);
if the type of ptr is changed? I'll give you a clue, the answer is none.

Do you have to find the declaration of ptr to see if the correct amount
of memory is being allocated?

Seach the groups archives for a bit for further discussion.
--
Flash Gordon
Still sigless on this computer
Aug 2 '06 #11
MQ

re****************@gmail.com wrote:
I want to thank all the participants on this thread for their
discussion and responses to the original post.

I realize after reading the responses that I do want to use malloc()
and not calloc().

I am trying to create a "standard" dynamic array structure that can be
used dynamically with a variety of data types. I want programmers to be
able to use this dynamic array through its public functions, without
the need to modify its source code. That is why I was avoiding a call
to sizeof() and using void pointers in my code.

I'm still not sure if what I want to do is possible in C, but your
comments have helped me along in the right direction. I'm sure I'll get
things figured out after I have some more time to spend with the code.
What about

struct array
{
void * start;
int length;
int elem_size;
};

create_array(array * a);

struct array my_array;
my_array.length = <some length>;
my_array.elem_size = <some size>;
create_array(&a);

create_array function would just be a wrapper to malloc. What other
functions do you need, other than ones to access elements, and possibly
resize the array?

If you need a data structure where you can insert and delete items, you
should possibly consider using a linked list. Resizing a dynamic array
using realloc() is a bad idea; memory managers may have to shift the
entire array in memory if extra space cannot be reallocated at the end
of memory. Linked lists dont have this problem.

MQ

Aug 2 '06 #12

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

4
by: Jacob Jensen | last post by:
This question has probably been asked a million time, but here it comes again. I want to learn the difference between the three type cast operators: static_cast, reinterpret_cast, dynamic_cast. A...
16
by: He Shiming | last post by:
Hi, I'm having a little bit of trouble regarding pointer casting in my program. I don't understand why the following two cases produce different results. Case 1: IInterface *pInterface = new...
8
by: Luc Le Blanc | last post by:
I have 2 APIs that store/recall a void *. Since all I need to store is a 32-bit struct, I pass the actual data (instead of a pointer to it) as a void *: typedef { UInt8 color;...
14
by: Enrico `Trippo' Porreca | last post by:
Given: typedef struct Node Node; struct Node { void *obj; Node *next; }; typedef struct Stack Stack; struct Stack {
35
by: ytrama | last post by:
Hi, I have read in one of old posting that don't cast of pointer which is returned by the malloc. I would like to know the reason. Thanks in advance, YTR
2
by: Maurice | last post by:
Hi, Is it legal to cast from void(*)(A*) to void(*)(B*)? Is it legal to cast from struct Derived{Base b; ...} to struct Base? I'm trying to get some inheritance and polymorphism in C and I...
7
by: Alfonso Morra | last post by:
How can this work ? I have the following declarations in a header: Header ========= typedef void (*VFPTR)(void) ; void FOO_Callback(void*, char*, char*, int, unsigned long, void*,void*);...
3
by: Beta What | last post by:
Hello, I have a question about casting a function pointer. Say I want to make a generic module (say some ADT implementation) that requires a function pointer from the 'actual/other modules'...
3
by: LongBow | last post by:
Hello all, First of all, sorry for multiple question per one thread. I have two questions. First what I think might be the easier problem. I am capturing data from an embedded device which I...
1
isladogs
by: isladogs | last post by:
The next online meeting of the Access Europe User Group will be on Wednesday 6 Dec 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, Mike...
0
by: jianzs | last post by:
Introduction Cloud-native applications are conventionally identified as those designed and nurtured on cloud infrastructure. Such applications, rooted in cloud technologies, skillfully benefit from...
0
by: mar23 | last post by:
Here's the situation. I have a form called frmDiceInventory with subform called subfrmDice. The subform's control source is linked to a query called qryDiceInventory. I've been trying to pick up the...
0
by: abbasky | last post by:
### Vandf component communication method one: data sharing ​ Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...
2
by: jimatqsi | last post by:
The boss wants the word "CONFIDENTIAL" overlaying certain reports. He wants it large, slanted across the page, on every page, very light gray, outlined letters, not block letters. I thought Word Art...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: fareedcanada | last post by:
Hello I am trying to split number on their count. suppose i have 121314151617 (12cnt) then number should be split like 12,13,14,15,16,17 and if 11314151617 (11cnt) then should be split like...
0
by: stefan129 | last post by:
Hey forum members, I'm exploring options for SSL certificates for multiple domains. Has anyone had experience with multi-domain SSL certificates? Any recommendations on reliable providers or specific...
1
by: davi5007 | last post by:
Hi, Basically, I am trying to automate a field named TraceabilityNo into a web page from an access form. I've got the serial held in the variable strSearchString. How can I get this into the...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.