Skip to main content
`Ctrl`+`K`

# 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

include/petscsys.h

## Examples

src/dm/tutorials/swarm_ex1.c
src/dm/tutorials/swarm_ex3.c
src/dm/tutorials/ex6.c
src/dm/tutorials/ex26.c
src/dm/impls/stag/tutorials/ex4.c
src/dm/impls/plex/tutorials/ex10.c
src/dm/tutorials/ex20.c
src/dm/impls/plex/tutorials/ex6.c
src/dm/field/tutorials/ex1.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