PetscMalloc1#
Allocates an array of memory aligned to PETSC_MEMALIGN
Synopsis#
#include <petscsys.h>
PetscErrorCode PetscMalloc1(size_t m1,type **r1)
Not Collective
Input Parameter#
m1 - number of elements to allocate (may be zero)
Output Parameter#
r1 - memory allocated
Note#
This uses sizeof()
of the memory type requested to determine the total memory to be allocated; therefore, you should not
multiply the number of elements requested by the sizeof()
the type. For example, use
PetscInt *id;
PetscMalloc1(10,&id);
not
PetscInt *id;
PetscMalloc1(10*sizeof(PetscInt),&id);
Does not zero the memory allocated, use PetscCalloc1()
to obtain memory that has been zeroed.
The PetscMalloc[N]()
and PetscCalloc[N]()
take an argument of type size_t
! However, most codes use value
, computed via int
or PetscInt
variables. This can overflow in
32bit int
computation - while computation in 64bit size_t
would not overflow!
It’s best if any arithmetic that is done for size computations is done with size_t
type - avoiding arithmetic overflow!
PetscMalloc[N]()
and PetscCalloc[N]()
attempt to work-around this by casting the first variable to size_t
.
This works for most expressions, but not all, such as
PetscInt *id, a, b;
PetscMalloc1(use_a_squared ? a * a * b : a * b, &id); // use_a_squared is cast to size_t, but a and b are still PetscInt
PetscMalloc1(a + b * b, &id); // a is cast to size_t, but b * b is performed at PetscInt precision first due to order-of-operations
These expressions should either be avoided, or appropriately cast variables to size_t
#
PetscInt *id, a, b;
PetscMalloc1(use_a_squared ? (size_t)a * a * b : (size_t)a * b, &id); // Cast a to size_t before multiplication
PetscMalloc1(b * b + a, &id); // b is automatically cast to size_t and order-of-operations ensures size_t precision is maintained
See Also#
PetscFree()
, PetscNew()
, PetscMalloc()
, PetscCalloc1()
, PetscMalloc2()
Level#
beginner
Location#
Examples#
src/dm/impls/plex/tutorials/ex10.c
src/dm/tutorials/ex26.c
src/dm/field/tutorials/ex1.c
src/dm/tutorials/swarm_ex1.c
src/dm/tutorials/ex6.c
src/dm/impls/stag/tutorials/ex4.c
src/dm/tutorials/ex20.c
src/dm/impls/plex/tutorials/ex6.c
src/dm/tutorials/swarm_ex3.c
src/dm/impls/plex/tutorials/ex15.c
Index of all Sys routines
Table of Contents for all manual pages
Index of all manual pages