gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:15:48 26 4
gpt4 key购买 nike

下面是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 部分。 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 指向的变量的生命周期就是程序的生命周期.

这个,连同上面的问题,让我想知道为什么你这么多使用指针?指针是导致代码出现问题的主要原因,尤其是对于(相对)初学者而言。

关于c - 分配 (const char *) 指针类型 - 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41801622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com