[petsc-users] Memory corruption with two-dimensional array and PetscMemzero

Jed Brown jed at jedbrown.org
Tue May 20 08:17:27 CDT 2014


Matthew Knepley <knepley at gmail.com> writes:
>>  array = (PetscScalar**)malloc(sizeof(PetscScalar*) * dof);
>>  for (k = 0; k < dof; k++){
>>    array[k] = (PetscScalar*)malloc(sizeof(PetscScalar) * dof);
>>   }
>>
>> When I pass it to MatSetValuesBlocked() there is a problem. Either Petsc
>> complains because I am not passing it the right way or when it accepts it,
>> wrong data is passed because the solution is not correct. Maybe Petsc
>> expect dof*dof values and only dof are passed ?
>>
>
> You can only pass contiguous memory to MatSetValues().

And, while perhaps atypical, VecGetArray2D will give you contiguous
memory behind the scenes, so it would work in this case.  (Make a Vec of
the right size using COMM_SELF instead of malloc.)

With C99, you can use VLA pointers to get the "2D indexing" without
setting up explicit pointers.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 835 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20140520/359f6aa4/attachment.pgp>


More information about the petsc-users mailing list