当前位置:  开发笔记 > 编程语言 > 正文

分配(const char*)指针类型 - 分段错误

如何解决《分配(constchar*)指针类型-分段错误》经验,为你挑选了1个好方法。

以下是代表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拥有一个不可变的字符串.这个不可变的字符串存储在.rodatasection中.firstname可以改变它的指向位置.


但是,下面是输出,

$ ./pq.exe
...
Before key assignment
Before first name assignment
Segmentation fault (core dumped)

如何解决这个问题?



1> Some program..:

当你这样做

Person *person = malloc(sizeof(Person));

你只为person结构分配内存.你没有分配内存person->value.您甚至没有初始化, person->value因此它的值将是不确定的,当您取消引用它时会导致未定义的行为.

我的建议是不要使用指针person->value,只是一个普通的结构(非指针)实例.


在一个不相关的注释中,要小心该指针person->sinKey,特别是如果您在实际代码中创建另一个函数中的结构.您所做的赋值将person->sinKey指向局部变量,一旦函数返回,该变量将超出范围.

如果在main函数中创建结构,它就可以工作,从那时起,您person->sinKey指向的变量的生命周期将是程序的生命周期.

这和上面的问题一起让我想知道你为什么这么多使用指针?指针是代码问题的主要原因,特别是对于(相对)初学者.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有