Dynamic array in C — Is my understanding of malloc and realloc correct?

孤街醉人 提交于 2019-11-28 16:13:48

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.

1) Am I coding this right?

Mostly. But data = (double*)realloc(data,11*sizeof(double)); loses the reference to the allocated memory if realloc fails, you should use a temporary pointer to hold the return value of realloc and check whether it's NULL (and you also ought to check the return value of malloc).

2) Tutorials I found use malloc without putting the (double*) in front.

In C, malloc returns a void* that can implicitly be converted to any other pointer type, so no cast is needed (and widely discouraged because casting that can hide errors). Visual Studio apparently compiles the code as C++ where the cast is required.

In C, you should not cast the return value of malloc().

Also, it's a bad idea to encode the type in the malloc() argument. This is a better way:

double* data = malloc(10 * sizeof *data);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!