我简化了项目的一部分来解决我遇到的这个特定问题(大小 4 的无效写入/分段错误)

I simplified a part of my project to solve this specific problem I have (invalid write of size 4/segmentation fault)

一步一步的编译器说“大小 4 的写入无效”,而通常这是一个分段错误。我不明白如何解决这个问题。在过去的几个小时里,我一直在为此烦恼。我错过了什么?

typedef struct Person{
  int age;
  char name[6]
} Person;

fun(Person **parray){
  *parray = realloc(*parray, 6 * (sizeof(Person)));
    for(int i = 0; i < 6; ++i){
      strcpy (parray[i]->name, "John");
      parray[i]->age = 15;
    }
}

int main() {
  Person *parray;
  
  parray = calloc(0, sizeof(Person));
  
  fun(&parray);
  
  return 0;
}

I don't understand how to solve this.

第一步应该是启用编译器警告,并修复编译器告诉您的所有错误。如果您使用 gcc,请打开 -Wall -Wextra 标志。

现在,错误在于 fun() 中的 parray[i] 不是正确的表达式——它将 parray 视为指向数组的指针,而实际上 parray 指向 main().

中的 单个 变量(同名)

您可以使用正确的表达式解决此问题:(*parray)[i].

更好的解决方法是完全避免双指针,例如:

#include <stdlib.h>
#include <string.h>

typedef struct Person{
  int age;
  char name[6]
} Person;

Person *fun(Person *parray){
  Person *result = realloc(parray, 6 * (sizeof(Person)));
  for(int i = 0; i < 6; ++i){
    strcpy(result[i].name, "John");
    result[i].age = 15;
  }
  return result;
}

int main()
{
  Person *parray = calloc(0, sizeof(Person));
  parray = fun(parray);

  free(parray);
  return 0;
}

如果你坚持将双指针传递给 fun() 并在内部更新它,你可以这样做,同时仍然尽量减少双指针的使用,如下所示:

void fun(Person **parray){
  Person *p = *parray = realloc(*parray, 6 * (sizeof(Person)));
  for(int i = 0; i < 6; ++i){
    strcpy(p[i].name, "John");
    p[i].age = 15;
  }
}