I am learning how to create dynamic 1D arrays in C. The code below tries to do the following:
malloc
, create a dynamic array of length 10
, that holds values of type double
.j/100
for j = 0, 1,..., 9
. Then print it out.realloc
.j/100
and print out each entry again.Testing:
double* data = (double*)malloc(10*sizeof(double));
for (j=0;j<10;j++)
{
data[j]= ((double)j)/100;
printf("%g, ",data[j]);
}
printf("\n");
data = (double*)realloc(data,11*sizeof(double));
for (j=0;j<11;j++)
{
if (j == 10){ data[j]= ((double)j)/100; }
printf("%g, ",data[j]);
}
free((void*) data);
Questions
Am I coding this right?
Tutorials I found use malloc
without putting the (double*)
in front. E.g.,
int *pointer;
pointer = malloc(2*sizeof(int));
This does not compile for me on Visual Studio 2010, Windows 7. The error message is
value of type void cannot be assigned to entity of type
int
.
Why does it work for those tutorials and not for me? Am I right to guess that it is because the compilers they are using automatically fill in the (int*)
for them in my example?
You're close.
In C (at least since the 1989 version of the standard), the cast before malloc
and realloc
is unnecessary, since C can convert values of type void *
to int *
without a cast. This is not true for C++, so based on the error you're getting, it sounds like you're compiling this code as C++ and not C. Check the documentation for VS2010 to determine how to compile code as C.
The following is my preferred style for writing a malloc
call:
double *data = malloc(10 * sizeof *data);
Since the type of the expression *data
is double
, sizeof *data
is equivalent to sizeof (double)
. This also means you don't have to adjust your malloc
calls if the type of data
changes.
As for the realloc
call, it's safer to assign the result to a temporary pointer value. realloc
will return NULL if it cannot extend the buffer, so it's safer to write
double *tmp;
...
tmp = realloc(data, 11 * sizeof *data);
if (!tmp)
{
// could not resize data; handle as appropriate
}
else
{
data = tmp;
// process extended buffer
}
Be aware that Microsoft's support for C ends with the 1989 version of the language; there have been two revisions of the language standard since then, which have introduced some new features and deprecated old ones. So while some C compilers support C99 features like mixed declarations and code, variable length arrays, etc., VS2010 will not.