当我调用 print_linklist 函数时,我遇到了分段错误。下面是函数定义:
document.querySelector("#xyz + .content").style.display = "none";
这里是调用它的主要方法:
//will display the node in a nice string
char * term_to_string(term_t * term){
int exp = term->exponent;
int coef = term->coefficient;
return ("%dx^%d", coef, exp);
}
**//will print the list using the nodde_to_string method
void print_linklist(node_t * curr){
printf("entering print to list!!!");
node_t * current = curr;
while(current != NULL){
printf("%s +", term_to_string(curr->term));
current = current->next_node;
}
}**
在调用该函数后,我得到“zsh:segmentation fault ./project1”。我什至没有得到“输入打印列表!!!”从 print_linklist 方法打印。
答案 0 :(得分:5)
return ("%dx^%d", coef, exp);
那不是在做你看起来认为它在做的事情(我认为你认为它正在做的是返回由某种printf
功能)。
但是,a, b
之类的逗号运算符同时计算 a
和 b
,但 result 是 b
。 n
-variant 与 a, b, c, d
一样,评估所有内容并返回最后一个 (d
)。
因此您返回 exp
就好像它是一个字符指针。几乎可以肯定不是(因为你试图用 printf
%d
它)所以,如果你这样对待它,可能会带来欢笑。
好吧,少一些欢闹,多一些崩溃/怪异,但你明白了:-)
您可以在堆内存中创建字符串并传递它们,但是对于该语言的新手来说,有时很难安全地做到这一点。相反,我建议简单地打印函数内的内容,例如:
void print_term(const term_t *term, const char *after){
printf("%dx^%d%s", term->coefficient, term->exponent, after);
}
void print_linklist(node_t *curr){
puts("entering print to list!!!");
node_t *current = curr;
while (current != NULL){
print_term(curr->term, " +");
current = current->next_node;
}
}
您会注意到我的“输入打印到列表”语句与您的略有不同,因为它使用了 puts
,它在末尾附加了一个换行符(您可以使用 {{1} },如果您想坚持使用 \n
)。
由于标准输出是针对终端设备进行行缓冲的,因此您看不到的原因几乎可以肯定是因为您的代码在刷新之前崩溃了(根据此答案)。在这种情况下,未刷新的数据很可能会消失。
答案 1 :(得分:0)
我什至没有得到“输入打印列表!!!”从 print_linklist 方法打印。
printf
不会导致任何内容打印到屏幕上。它只是将一个字符串复制到一个缓冲区中,以便稍后打印。如果要强制打印缓冲区,可以调用 printf
。如评论中所述,如果 stdout 被定向到交互式设备,则在输出字符串中包含 fflush
通常也会导致缓冲区刷新到实际输出设备。
调用该函数后,我得到“zsh:segmentation fault ./project1”。
这可能发生在 \n
中,如果您使用无效的指针参数调用它,当它试图取消引用其参数时。
答案 2 :(得分:0)
出现分段错误的原因可能有很多,但尝试打印列表并不是其中之一。如果您的 read_objects()
声明是这样的 read_objects(node_t * curr)
那么您不应该将指针的地址作为参数传递
read_objects(&node_ptr);
这应该是 read_objects(node_ptr);
另外,如果你想遍历列表并打印它,你应该在main()
函数node_t *head = NULL;
中创建一个指向列表头部的指针
并将其作为参数传递给 print_linklist(head);
。
之后,使*current
指向列表node_t * current = head;
的头部。
这样你就从一开始就开始打印节点。您还应该检查列表是否为空。