1

次のコードは、ユーザー入力からリンクされたリストを作成して表示することになっていますが、表示機能によってセグメンテーション違反が発生します。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>

struct node{
  int value;
  struct node *next;
};

struct node* createLinkedList()
{
  char string[6];
  char string2[6] = "exit";
  struct node* head;
  struct node* prev;
  struct node temp;
  head = &temp;
  prev = &temp;
  prev->next = NULL;
  printf("Enter the first number\n");
  scanf("%s",string);   
  if(strcmp(string,string2)!=0){
    prev->value=atoi(string);
  }
  while(strcmp(string,string2)!=0){
    printf("Enter the next number\n");
    scanf("%s",string); 
    if(strcmp(string,string2)!=0){
      prev->next=(struct node *)malloc(sizeof(struct node));
      prev->next->next=NULL;
      prev->next->value=atoi(string);       
      prev = prev->next;
    }
    else{
      break;
    }
  }
  return head;
}

void printLinkedList(struct node* head){
  struct node* current = head;
  while(current!=NULL){
    printf("%d -> ",current->value);
    current=current->next;
  }
}

int main()
{
  struct node *first;
  first = createLinkedList();
  printLinkedList(first);
  return(0);
}

デバッグ情報は次のとおりです。

Enter the first number
1
Enter the next number
2
Enter the next number
3
Enter the next number
4
Enter the next number
exit

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400865 in printLinkedList (head=0x7fffffffe150) at linkedList.c:45
45      printf("%d -> ",current->value);
4

2 に答える 2

1

問題は次の行にあります。

struct node* head;
struct node* prev;
struct node temp;
head = &temp;
prev = &temp;

temp はスタック上で宣言されているため、スコープ外になると失われます - この場合は関数の終了後です。temp のアドレスを head と prev の両方に割り当てるため、返された head はスタックのガベージを指します。

于 2013-10-09T20:42:43.400 に答える
0

それ以外の

struct node temp;
head = &temp;
prev = &temp;

そのはず

head =(struct node *)malloc(sizeof(struct node));
prev = head;

スタックに格納されているローカル構造体のメモリ アドレスを返しています。代わりに、ヒープからメモリを要求してヘッド ノードを格納し、そこにアドレスを返す必要があります。

于 2013-10-09T20:41:45.283 に答える