我简化了项目的一部分来解决我遇到的这个特定问题(大小 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;
}
}
一步一步的编译器说“大小 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;
}
}