在定义了Student类型(它是由两个字符数组和一个int组成的结构)之后,我创建了一个指向Student的指针数组,为了在一系列函数中修改其内容我需要
struct Result : Decodable {
let description : String
enum Keys : CodingKey {
case weather
case description
}
init(from decoder: Decoder) throws {
let con = try! decoder.container(keyedBy: Keys.self)
var arr = try! con.nestedUnkeyedContainer(forKey: .weather)
let con2 = try! arr.nestedContainer(keyedBy: Keys.self)
let desc = try! con2.decode(String.self, forKey: .description)
self.description = desc
}
}
我的问题是,这段简单的代码在运行后返回-1作为退出状态。为什么会这样?
答案 0 :(得分:3)
指针students[0]
未初始化。取消引用它会导致未定义的行为。
在尝试访问它之前,使用有效对象的地址对其进行初始化。
student test;
students[0] = &test;
strcpy(students[0]->name, "test");
strcpy(students[0]->surname, "test");
students[0]->grade = 18;
答案 1 :(得分:3)
因为它是UB。您只有指针,没有分配实际的结构。
students[x] = malloc(sizeof(*students[0]));
或静态
student s;
students[x] = &s;
或
students[x] = &(student){.name = "test", .surname ="test", .grade = 18};
答案 2 :(得分:1)
指针没有指向任何地方,因为您尚未分配任何内存来指向它们。
int main(void)
{
student* students = (student*)malloc(sizeof(student)*[NUMBER_OF_STUDENTS]); \\malloc dynamically allocate heap memory during runtime
strcpy(students[0]->name, "test");
strcpy(students[0]->surname, "test");
students[0]->grade = 18;
return EXIT_SUCCESS;
}
*注意用marko编辑–严格地,指针指向堆栈位置中最后的那个或保存它的寄存器-它可能什么也不是,或者您实际上在乎。 UB的乐趣