分段错误,内存未分配

时间:2012-02-10 11:21:04

标签: c

代码如下,似乎没有任何问题。我的gcc找不到alloc.h

print(node *q)
    39  {   
    40      node *p=q;
    41              do
    42      {
    43          printf("%d",p->n);
    44          if(p->ptr != NULL)
    45          p=p->ptr;   
    46          else

(gdb)p p $ 1 =(节点*)0x0

分配内存的代码是

    if(p== NULL)
    {
            p=(node *)malloc(sizeof(node));
            if(p== NULL)
                    printf("The malloc failed\n");
            p->n=num;
            p->ptr=NULL;
    }

当我在调试器中运行时,没有malloc失败的消息。

任何人都可以提供帮助。 此致

Sraddha

    add(node **q)
    {
         node *p=*q;
         int num;
         printf("Enter the number you want to add");
         scanf("%d", &num);
         if(p== NULL)
         {
            p=(node *)malloc(sizeof(node));
            if(p== NULL)
                    printf("The malloc failed\n");
            p->n=num;
            p->ptr=NULL;
         }
    }

2 个答案:

答案 0 :(得分:5)

您需要在*q函数中指定add(),而不是本地p

add(node **q)
{
     int num;
     printf("Enter the number you want to add");
     scanf("%d", &num);
     if(*q == NULL)
     {
        *q = malloc(sizeof(node)); /* no need to cast return value. */

        /* Corrected if logic to not access failed malloc. */
        if(*q == NULL)
        {
            printf("The malloc failed\n");
        }
        else
        {
            *q->n=num;
            *q->ptr=NULL;
        }
     }
}

答案 1 :(得分:0)

除了hmjd的回答所解决的问题之外,您可能还想考虑不同的程序设计。你已经让函数做了三件完全不同的事情:与用户交互,内存分配和实际算法。这个程序设计是导致错误的真正罪魁祸首。

相反,您可能想要考虑更面向对象的方法:

int prompt_user (void) // this function interacts with the user ("GUI")
{
  int num;
  printf("Enter the number you want to add");
  scanf("%d", &num);
  getchar(); // discard line feed character from stdin

  return num;
}

void init_node (node* new_node, int num)
{
  new_node->n = num;
  new_node->ptr = NULL;
}


// this code is the caller:
{
  node* q = NULL;

  ...

  int num = prompt_user();

  if(q == NULL)
  {
    q = malloc(sizeof(node));
    if(q == NULL)
    {
      // error handling
    }
  }  

  init_node(q, num);

  ...

  free(q);
}