这让我疯了,我做完了我的作业但出于某种原因
for (int i = 0; i < room->num_of_challenges; i++) { // need a check
if (strcmp(room_to_enter, room->challenges[i].challenge->name) == 0) {
room->challenges[i].start_time = start_time;
room->challenges[i].visitor = malloc(sizeof(room->challenges[i].visitor));
room->challenges[i].visitor->current_challenge = malloc(sizeof(room->challenges[i].visitor->current_challenge));
*room->challenges[i].visitor->current_challenge = room->challenges[i];
*room->challenges[i].visitor->room_name = NULL;
*room->challenges[i].visitor->room_name = malloc(strlen(room_to_enter)+1);
strcpy(*room->challenges[i].visitor->room_name, room_to_enter);
inc_num_visits(room->challenges[i].challenge);
}
}
该程序因某种原因崩溃了,此时:
*room->challenges[i].visitor->room_name = malloc(strlen(room_to_enter)+1);
这是一个3页的代码,每个页面都有标题,每页大约300行,所以我不能发布所有内容,这里也是结构:
struct SChallengeActivity;
typedef struct SVisitor
{
char *visitor_name;
int visitor_id;
char **room_name;
struct SChallengeActivity *current_challenge;
} Visitor;
typedef struct SChallengeActivity
{
Challenge *challenge;
Visitor *visitor;
int start_time;
} ChallengeActivity;
typedef struct SChallengeRoom
{
char *name;
int num_of_challenges;
ChallengeActivity *challenges;
} ChallengeRoom;
我们无法编辑结构,因为它是由类似的家庭作业给出的,事情是我试图将此行设置为NULL,如下所示:
*room->challenges[i].visitor->room_name = NULL;
并且它仍然在该行崩溃,由于某种原因它无法到达结构中的那个字段。 注意:忽略编码,我知道我应该检查每行后的malloc,但是现在我希望它能够工作,我已经整晚都在工作,我不能,有什么帮助吗? 谢谢
答案 0 :(得分:1)
为访问者分配内存时,只分配指针的大小。挑战中的访问者字段只是指向访问者的指针。因此,您没有分配足够的内存。你应该使用:
malloc(sizeof(Visitor))
获取Visitor结构的实际大小并分配足够的空间。
此外,在分配之前将指针设置为null是无用的。对malloc()的调用将覆盖它们。
答案 1 :(得分:1)
另外,
saveBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (numberIn.getText() != null {
numberToSave = numberIn.getText().toString();
myNumbers();
}
}
});
room_name是一个char **(指向指针的指针),这意味着它仍然是一个指针,你可以在它设置之前取消引用它。
不确定为什么它需要是一个指向指针的指针,但是如果它需要,那么你首先必须为一个或多个指针(例如数组)分配内存:
*room->challenges[i].visitor->room_name = NULL;