递归调用时总线10错误

时间:2015-02-15 06:09:43

标签: c string recursion struct

所以我在这个递归函数调用方面遇到了麻烦...... 我正在尝试编写一个函数,它将检查我的结构中的每个字符串是否遵循字母顺序,如果为真,则返回1,否则返回0.

我一直得到一个总线10错误,我试过把print语句/找不到我的错误。 有人可以帮忙吗? 谢谢。

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

typedef struct string_list string_list;
struct string_list {
  char *val;
  string_list *next;
};

int sl_sorted_asc(string_list *ss) {

 int  string_c = strcmp(ss->val, ss->next->val);
 if (string_c >= 0) {
   if (ss->next != NULL) {
   sl_sorted_asc(ss->next);
   }
   else {
     return 1;
   }
 }
 else  {
   return 0;
 }
 return 1;
}

int main() {

  string_list hi;
  hi.val = "Leeho";
  hi.next->val = "Ferris";
  hi.next->next->val = "Donny";

printf("%d\n", sl_sorted_asc(&hi));

}

3 个答案:

答案 0 :(得分:1)

这可能是因为你的sl_sorted_asc函数的这一行

 int  string_c = strcmp(ss->val, ss->next->val);

您首先不会检查ss-&gt; next是否为null。

答案 1 :(得分:1)

http://ericlippert.com/2014/03/05/how-to-debug-small-programs/的强制性链接)

为了弄清楚这样的问题,有一个名为valgrind的程序,这个程序非常宝贵(例如,如果你的操作系统不支持它,现在就获得虚拟机!);例如,在这种情况下它报告 ==3637== Use of uninitialised value of size 8 ==3637== at 0x4005BE: main (bus10.c:33)

第33行是&#34; hi.next-&gt; val = ...&#34 ;;问题(在这个行 - 它是唯一的地方吗?)就是那样,你从来没有做过&#34; hi.next = ...&#34;,所以hi.next points到......什么? 基本上,任何事情 - 堆栈生成为hi变量腾出空间的那一刻,hi.next将占用那里的任何位,意味着它可以指向几乎任何东西(包括它自己,不存在的内存地址 - 你的名字它)。

TLDR:从不,永远使用你没有初始化的变量(除非你想让专业的C程序员为你讲授&#34;未定义的行为&#34;&amp; friends)

答案 2 :(得分:0)

代码引用未分配的内存

例如,在以下几行中:

// allocates one instance of the struct on the stack
string_list hi;    

// sets the 'val' field of the instance of the struct on the stack
hi.val = "Leeho";    

// follows a non-initialized pointer, 
// in the instance of the struct on the stack,
// to a non allocated instance of the struct
// then writes on that non allocated instance of the struct
// I.E. writes to random memory address
hi.next->val = "Ferris";   

// follows a non-initialized pointer
// contained in a non allocated instance of the struct
// to a non allocated instance of the struct
// then writes on that non allocated instance of the struct  
// I.E. follows random values in memory 
//      to some random location in memory
//      then writes on an offset to that random location           
hi.next->next->val = "Donny";