以下是代表Person
,
typedef struct{ const char *firstName; const char *lastName; }PersonDetails; typedef struct{ const long *sinKey; PersonDetails *value; }Person;
在哪里,填充firstName
成员创建分段错误,
int main(void){ .... Person *person = malloc(sizeof(Person)); const long key1 = 364222888L; printf("Before key assignment\n"); person->sinKey = &key1; printf("Before first name assignment\n"); person->value->firstName = "Sham"; printf("Before last name assignment\n"); person->value->lastName = "S"; .... }
const char *firstName
拥有一个不可变的字符串.这个不可变的字符串存储在.rodata
section中.firstname
可以改变它的指向位置.
但是,下面是输出,
$ ./pq.exe ... Before key assignment Before first name assignment Segmentation fault (core dumped)
如何解决这个问题?
当你这样做
Person *person = malloc(sizeof(Person));
你只为person
结构分配内存.你没有分配内存person->value
.您甚至没有初始化, person->value
因此它的值将是不确定的,当您取消引用它时会导致未定义的行为.
我的建议是不要使用指针person->value
,只是一个普通的结构(非指针)实例.
在一个不相关的注释中,要小心该指针person->sinKey
,特别是如果您在实际代码中创建另一个函数中的结构.您所做的赋值将person->sinKey
指向局部变量,一旦函数返回,该变量将超出范围.
如果在main
函数中创建结构,它就可以工作,从那时起,您person->sinKey
指向的变量的生命周期将是程序的生命周期.
这和上面的问题一起让我想知道你为什么这么多使用指针?指针是代码问题的主要原因,特别是对于(相对)初学者.