【发布时间】:2020-07-09 15:33:50
【问题描述】:
好的,所以,根据这个post,我知道我正在尝试访问我无法访问的内存。我唯一能想到的就是我在哪里创建任务实例并为其分配值,但是,查看this 帖子,我看不出我的实现在哪里不正确。
任何帮助将不胜感激。
#include "task.h"
struct node{
Task *task;
struct node *next;
};
void insert(struct node **head, Task *task);
void delete(struct node **head, Task *task);
void traverse(struct node *head);
#ifndef TASK_H
#define TASK_H
typedef struct task{
char *name;
int tid;
int priority;
int burst;
} Task;
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "list.h"
#include "task.h"
#include "schedulers.h"
void add(char *name, int priority, int burst){
printf("beginning of add\n"); // Just a test. I never see this message print
static int x = 1;
struct node *list_head = NULL;
Task xtask = (Task) { .name = name, .tid = x, .priority = priority, .burst = burst};
insert(&list_head, &xtask);
x++;
}
void schedule(){
printf("test"); // just a place holder for now
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "task.h"
#include "list.h"
#include schedulers.h"
#define SIZE 100
int main(int argc, char ** argv[]){
FILE *in;
char *temp;
char task[SIZE];
char *name;
int priority;
int burst;
in = fopen(argv[1], "r");
if (argv[1] != NULL){
while (fgets(task, SIZE, in) != NULL){
temp = strdup(task);
name = strsep(&temp, ",");
priority = atoi(strsep(&temp, ","));
burst = atoi(strsep(&temp, ","));
add(name, priority, burst);
free(temp);
}
fclose(in);
}
else{
printf("invalid\n");
return 0;
}
schedule();
return 0;
}
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "list.h"
#include "task.h"
void insert(struct node **head, Task *newTask){
struct node *newNode = malloc(sizeof(struct node));
newNode ->task = newTask;
newNode ->next = *head;
*head = newNode;
}
void delete(struct node **head, Task *task){
struct node *temp;
struct node *prev;
temp = *head;
if (strcmp(task ->name, temp -> task -> name) == 0){
*head = (*head) -> next;
}
else {
prev = *head;
temp = temp -> next;
while (strcmp(task -> name, temp -> task -> name) != 0) {
prev = temp;
temp = temp -> next;
}
prev -> next = temp -> next;
}
}
void traverse(struct node *head){
struct node *temp;
temp = head;
while (temp != NULL){
printf("[%s] [%d] [%d]\n", temp-> task -> name, temp -> task -> priority, temp -> task -> burst);
temp = temp -> next;
}
}
【问题讨论】:
-
"我会根据需要继续添加。"这很乏味。您仍然没有显示您如何称呼
add。创建一个最小的例子并完整地展示它,否则我们只能猜测出了什么问题。 -
我目前正在添加所有内容。感谢您的意见。
-
在调用
add之前有很多可能的段错误:argv[1]可能是NULL,因此fopen的参数无效;所有对strsep的调用都可以返回NULL,当传递给atoi时会崩溃。如果不知道如何调用程序或使用fopen打开的文件的内容是什么,就不可能知道发生了什么。在任何情况下,您都应该通过确保非空参数来保护您的代码不崩溃。 -
argv[]是传递给程序的参数。您的程序需要一个参数,即从中读取任务的文件的名称。这可以通过在 shell 中调用program filename或通过在文件管理器中拖动程序图标上的文件图标来完成。如果您从开发环境运行,将有一个选项来指定参数。 -
不客气。但是看看我们离你最初的帖子还有多远才能找到问题的根源。
标签: c struct segmentation-fault