[英]Why am I getting Segmentation fault (core dumped) or bus error (core dumped) when trying to populate a struct?
[英]Why am i getting Segmentation fault (core dumped) when i try to print a struct using recursion?
我是 C 的新手。我正在嘗試制作具有以下結構的鏈表。
struct ListNode {
int val;
struct ListNode *next;
};
所以我使用遞歸從給定數組創建鏈表。
struct ListNode makeNode(int val, struct ListNode* l){
struct ListNode node;
node.val = val;
node.next = l;
return node;
}
struct ListNode makeNodeFromList(int arr[], int length, int index){
// Checks if the given index is the last element of the array
// (Base Condition)
if ((length-1) == index){
return makeNode(arr[index], NULL);
}
struct ListNode next;
next = makeNodeFromList(arr, length, index+1);
return makeNode(arr[index],&next);
}
但是,當我嘗試使用以下代碼打印結果時,它會不斷打印第二個元素,並且出現Segmentation fault (core dumped)
錯誤。
void printNode(struct ListNode *l){
// Prints the each value of the struct, separated by tab.
if ((l->next) != NULL){
printf("%d\t",(l->val));
printNode((l->next));
}
else{
printf("%d\n",(l->val));
}
}
int main() {
int arr[3] = {1,2,3};
struct ListNode item;
item = makeNodeFromList(arr,3,0);
printNode(&item);
}
*-編輯
整個代碼而不是片段。
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode makeNode(int val, struct ListNode* l){
struct ListNode node;
node.val = val;
node.next = l;
return node;
}
struct ListNode makeNodeFromList(int arr[], int length, int index){
printf("%d\t", arr[index]);
// Checks if the given index is the last element of the array.
if ((length-1) == index){
return makeNode(arr[index], NULL);
}
struct ListNode next;
next = makeNodeFromList(arr, length, index+1);
return makeNode(arr[index],&next);
}
void printNode(struct ListNode *l){
// Prints the each value of the struct, separated by tab.
if ((l->next) != NULL){
printf("%d\t",(l->val));
printNode((l->next));
}
else{
printf("%d\n",(l->val));
}
}
int main() {
int arr[3] = {1,2,3};
struct ListNode item;
item = makeNodeFromList(arr,3,0);
printNode(&item);
}
我無法弄清楚我犯的錯誤。
我試圖找到類似的問題,但找不到類似的案例。
在 gdb 下運行你的程序,我發現你的程序在printf("%d\t",(l->val));
. 無法訪問變量l->next
。 正如@Someprogrammerdude 在上面告訴您的那樣,這是因為它是makeNodeFromList()
中的next
一個局部變量,返回時不在 scope 中。
最小的修復是(你需要一個免費的匹配):
#include <string.h>
struct ListNode makeNodeFromList(int arr[], int length, int index){
if ((length-1) == index) {
return makeNode(arr[index], NULL);
}
struct ListNode next = makeNodeFromList(arr, length, index+1);
struct ListNode *p = malloc(sizeof(next));
memcpy(p, &next, sizeof(next));
return makeNode(arr[index], p);
}
另外,您的printNode()
對我來說不合適。 試試這個:
void printNode(struct ListNode *l) {
if(!l) return;
printf("%d\t", l->val);
printNode(l->next);
}
這是makeNodeFromList()
的簡化版本:
void makeNodeFromList(int length, int arr[length], struct ListNode nodes[length]){
for(size_t i = 0; i < length; i++) {
nodes[i].val = arr[i];
nodes[i].next = i + 1 < length ? &nodes[i + 1] : NULL;
}
}
int main() {
int arr[] = {1,2,3};
struct ListNode nodes[sizeof arr / sizeof *arr];
makeNodeFromList(sizeof arr / sizeof *arr, arr, nodes);
printNode(nodes);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.