将结构指针作为函数参数传递(段错误未知)
Passing a structure pointer as a function argument (Seg fault unknown)
头文件 #1 "city.h"
typedef struct City{
double* lat;
double* lon;
double* pop;
char* airport;
char* name;
}City;
头文件 #2 "vector.h"
typedef struct Vector{
City* cityArray[26]; // 26 pointers to struct City
}Vector;
C档
#include "vector.h"
#include "city.h"
#include <stdlib.h>
void init(Vector *ptr) {
ptr->cityArray[0]->name = "hi"; // Error Seg Fault!
}
您好,您的建议确实有效,但出于某种原因,我现在遇到段错误,尽管我 100% 确定代码没有更改。你能看出哪里出了问题吗?
试试这个 -
ptr->cityArray[0]->name = "hi"; // ptr is pointer to struct vector
由于cityArray
是struct Vector
的成员变量,使用struct变量或指针访问它。
不能这样做
cityArray[0]->name = "hi";
因为cityArray
不是任何独立的指针数组。
编辑
当您遇到分段错误时,您需要为结构指针 ptr
以及结构 city
.
中存在的 char *
分配内存
在函数中这样做 -
ptr=malloc(sizeof(Vector));
ptr->cityArray[0]->name=malloc(3); // size 3 to store "hi" you can give desired size.
但是记得要free
分配内存。
在您的例子中,vector.h 出现在 city.h 之前。您需要在 vector.h 之前放置 city.h 以使 city
的定义对 [=12] 可见=].
也就是说,cityArray
本身并不是一个独立的变量,它被称为成员变量。您需要有一个结构类型的变量才能使用 cityArray
。像
Vector Vec;
Vec.cityArray[0]->name ....
等等。还要记下变量的类型和使用的初始值设定项。他们都应该匹配。
头文件 #1 "city.h"
typedef struct City{
double* lat;
double* lon;
double* pop;
char* airport;
char* name;
}City;
头文件 #2 "vector.h"
typedef struct Vector{
City* cityArray[26]; // 26 pointers to struct City
}Vector;
C档
#include "vector.h"
#include "city.h"
#include <stdlib.h>
void init(Vector *ptr) {
ptr->cityArray[0]->name = "hi"; // Error Seg Fault!
}
您好,您的建议确实有效,但出于某种原因,我现在遇到段错误,尽管我 100% 确定代码没有更改。你能看出哪里出了问题吗?
试试这个 -
ptr->cityArray[0]->name = "hi"; // ptr is pointer to struct vector
由于cityArray
是struct Vector
的成员变量,使用struct变量或指针访问它。
不能这样做
cityArray[0]->name = "hi";
因为cityArray
不是任何独立的指针数组。
编辑
当您遇到分段错误时,您需要为结构指针 ptr
以及结构 city
.
char *
分配内存
在函数中这样做 -
ptr=malloc(sizeof(Vector));
ptr->cityArray[0]->name=malloc(3); // size 3 to store "hi" you can give desired size.
但是记得要free
分配内存。
在您的例子中,vector.h 出现在 city.h 之前。您需要在 vector.h 之前放置 city.h 以使 city
的定义对 [=12] 可见=].
也就是说,cityArray
本身并不是一个独立的变量,它被称为成员变量。您需要有一个结构类型的变量才能使用 cityArray
。像
Vector Vec;
Vec.cityArray[0]->name ....
等等。还要记下变量的类型和使用的初始值设定项。他们都应该匹配。