结构指针数组的问题

时间:2019-05-17 22:08:29

标签: c pointers struct typedef

在定义了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作为退出状态。为什么会这样?

3 个答案:

答案 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的乐趣