所以我在这个递归函数调用方面遇到了麻烦...... 我正在尝试编写一个函数,它将检查我的结构中的每个字符串是否遵循字母顺序,如果为真,则返回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));
}
答案 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";