Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Valgrind在PETSc中的字符*赋值时报告大小为8的无效写入?_C_Valgrind_Petsc - Fatal编程技术网

为什么Valgrind在PETSc中的字符*赋值时报告大小为8的无效写入?

为什么Valgrind在PETSc中的字符*赋值时报告大小为8的无效写入?,c,valgrind,petsc,C,Valgrind,Petsc,我在PETSc的申请被终止了。我已经检查了Valgrind的情况,但我不理解它的报告: ==97331== Invalid write of size 8 ==97331== at 0x10007FED5: PetscHeaderCreate_Private (inherit.c:40) ==97331== by 0x1013EFE23: TSResilCreate (tsresil.c:525) ==97331== by 0x10139A877: TSGetResil (ts

我在PETSc的申请被终止了。我已经检查了Valgrind的情况,但我不理解它的报告:

==97331== Invalid write of size 8
==97331==    at 0x10007FED5: PetscHeaderCreate_Private (inherit.c:40)
==97331==    by 0x1013EFE23: TSResilCreate (tsresil.c:525)
==97331==    by 0x10139A877: TSGetResil (ts.c:5252)
==97331==    by 0x10138D17E: TSSetFromOptions (ts.c:421)
==97331==    by 0x100011A47: SolveODE (in ./ex31)
==97331==    by 0x100012E98: main (in ./ex31)
==97331==  Address 0x102dde080 is 1,776 bytes inside a block of size 1,780 alloc'd
==97331==    at 0x100025EA1: malloc (vg_replace_malloc.c:303)
==97331==    by 0x10010E8C1: PetscMallocAlign (mal.c:34)
==97331==    by 0x10011063D: PetscTrMallocDefault (mtr.c:188)
==97331==    by 0x1013EFDA0: TSResilCreate (tsresil.c:525)
==97331==    by 0x10139A877: TSGetResil (ts.c:5252)
==97331==    by 0x10138D17E: TSSetFromOptions (ts.c:421)
==97331==    by 0x100011A47: SolveODE (in ./ex31)
==97331==    by 0x100012E98: main (in ./ex31)
在tsresil.c:525中(我在PETSc中的实现):

在inherit.c中:

 22: /*
 23:    PetscHeaderCreate_Private - Creates a base PETSc object header and fills
 24:    in the default values.  Called by the macro PetscHeaderCreate().
 25: */
 26: PetscErrorCode  PetscHeaderCreate_Private(PetscObject h,PetscClassId classid,const char class_name[],const char descr[],const char mansec[],
 27:                                           MPI_Comm comm,PetscObjectDestroyFunction destroy,PetscObjectViewFunction view)
 28: {
 29:   static PetscInt idcnt = 1;
 30:   PetscErrorCode  ierr;
 31: #if defined(PETSC_USE_LOG)
 32:   PetscObject     *newPetscObjects;
 33:   PetscInt         newPetscObjectsMaxCounts,i;
 34: #endif

 37:   h->classid               = classid;
 38:   h->type                  = 0;
 39:   h->class_name            = (char*)class_name;
 40:   h->description           = (char*)descr;
 41:   h->mansec                = (char*)mansec;

 ...
PetsObject是指向以下对象的指针:

typedef struct _p_PetscObject {
  ...
  char                 *class_name;    /*  for example, "Vec" */
  char                 *description;
  ...

因此,问题似乎与
char*descr
的赋值有关,但我看不出原因。大小8会通知指针错误否?

看起来Valgrind在抱怨,因为您只为PetsObject分配了1780字节,而这8字节的写入(从字节1776开始)足以写入未分配的内存


您需要增加分配的大小,或者增加结构的大小,这取决于分配的完整定义和方法。

很难从上下文中分辨出来,但Valgrind似乎在抱怨,因为您只为PetsObject分配了1780字节,而这是8字节的写操作(从字节1776开始)足以写入您未分配的内存。请更新问题以显示如何分配PetsObject。这是有意义的!PetsObject的分配肯定太小。请稍候,我会检查您是否将我放入正确的方向。我不知道,但“所有PETSc对象都以PETSCHEADER中定义的字段开头。”。将PETSCHEADER添加到我的PetscObject中解决了我的问题。听起来不错。然后我会将我的评论作为答案发布。
typedef struct _p_PetscObject {
  ...
  char                 *class_name;    /*  for example, "Vec" */
  char                 *description;
  ...