我正在尝试编写一个从数组中创建链接列表的函数:
typedef struct {
char airplane_name[AIRPLANE_NAME_MAX_LENGTH];
char airplane_model[MODEL_LENGTH];
float age;
struct plane *next_plane;
} plane;
int CreateAirplaneList(plane **plane_input_output) {
plane plane_name_arr[NUM_OF_PLANES] = { {"Beit-Shean", "737", 5}, {"Ashkelon", "737", 10.25}, {"Hedera", "737", 3},
{"Kineret", "737", 7.5},{"Naharia", "737", 1}, {"Tel-Aviv", "747", 20}, {"Haifa", "747", 15}, {"Jerusalem","747",17},
{"Ashdod", "787", 1}, {"Bat Yam","787", 1.5}, {"Rehovot", "787", 0.5} };
plane *new_plane = NULL, *list=NULL;
int i = 0;
for (i = 0; i < NUM_OF_PLANES;i++) {
new_plane = (plane*)malloc(sizeof(plane));
if (new_plane == NULL) {
printf("Memory allocation failed\n");
return FAILURE;
};
new_plane = &plane_name_arr[i];
printf("name%d:%s\n", i, new_plane->airplane_name);
new_plane->next_plane = list;
list = new_plane;
printf("new name%d:%s\n", i, list->airplane_name);
}
printf("all good");
*plane_input_output = list;
return SUCCESS;
};
以main()
作为参数在NULL
上运行时,它卡住了。
int main(){
plane **x = NULL;
CreateAirplaneList(x);
return 0;
}
有什么想法吗?
答案 0 :(得分:3)
只需阅读代码并猜测应该执行的操作,我就会看到以下内容:
*new_plane = plane_name_arr[i];
上面的代码将数组中元素的地址写入new_plane并 丢弃刚刚分配的指针。您可能需要将值从plane_name_arr [i]复制到新内存。
*plane_input_output = list;
您提到您从main调用NULL的方法。当您在方法末尾写入该内存时,此方法也不起作用。
int main(int argc, char *argv[]) {
plane *head = NULL;
CreateAirplaneList(&head);
}
这需要有一些可以写入的内存。
这样称呼:
int CreateAirplaneList(plane **plane_input_output)
确保 CreateAirplaneList 末尾的写操作实际上可以将结果写在某个位置。
您的方法plane **x = NULL;
CreateAirplaneList(x);
将指向指针的指针作为参数。
如果您像使用以下方法那样调用它:
plane *head;
您将传入值NULL。这意味着最后的写入尝试写入NULL。由于要在方法之外传递链接列表,因此要为该方法提供一个可以写入结果的地址。
因此,您将创建所需类型的变量。在这种情况下,CreateAirplaneList(&head)
然后将该变量的地址传递给方法*plane_input_output = list
,以便在head
写入时将其写入{{1 }}。
在快速查看它的过程中,可能还有更多我未曾发现的错误。祝你好运。
答案 1 :(得分:2)
使用:
new_plane = (plane*)malloc(sizeof(plane));
您正在为飞机分配空间。然后加上:
new_plane = &plane_name_arr[i];
您扔掉内存,并用指针替换到planes数组中。可能您打算这样做:
*new_plane = plane_name_arr[i];
它将平面数据从阵列复制到分配的内存中。
(在您的版本中,该数组是一个本地数组,即在堆栈上,在函数返回后不再存在。其内存将被重用,并且您的链接列表显示为垃圾。)
在您的main
中,必须使用列表头的地址调用该函数:
plane *x = NULL; // x is the list
CreateAirplaneList(&x); // &x is the address of the list
创建功能现在可以修改x
中的列表。