我是一个初学者程序员,我正在学习我的第一门语言,C。
我主要是从Deitel和Deitel的《C如何编程》一书中学习的,但也使用了大学里的示例任务和东西,但我被一个卡住了。
我对指针有一个非常基本的理解-在变量前面添加&使它打印一个地址,* 使用指针来使用存储在该地址的值等。
我写的这段代码是用来计算两个数字的最大公分母的,实际上根本不需要指针。它使用了两个函数,逻辑是正确的,因为如果我从第二个函数执行,它会将正确的答案打印到屏幕上,而不是返回到主函数。这就是问题所在。
当第二个函数返回答案值时,由于某种原因,它返回了我只能假设的指针。我不知道为什么它会这样做。我可以使用它并转换它来查找值-但是它似乎是第二个函数的本地指针,并且被写入了。我在网上或我的书中找不到任何关于如何解决这个问题的想法。
这是我的代码和输出,我知道我可以在第二个函数中打印出来,但我更想知道它是如何以及为什么没有像我希望的那样返回值。
代码
#include <stdio.h>
int greatestCD (int num1, int num2);
int main(void)
{
int a=0, b=0;
int result;
printf("Please enter two numbers to calculate the greatest common denominator from\n");
scanf("%d%d", &a, &b);
result = greatestCD (a,b);
printf("Using the correct in main way:\nThe greatest common denominator of %d and %d is %d\n",a,b, result);
}
int greatestCD (int num1 ,int num2)
{
if (num2==0){
printf("Using the cheaty in gcd function way:\nThe greatest common denominator is %d\n",num1);
return num1;
} else {
greatestCD(num2,(num1%num2));
}
}
输出(使用12和15 -答案应为3)
C:\Users\Sam\Documents\C programs>gcd
Please enter two numbers to calculate the greatest common denominator from
12
15
Using the cheaty in gcd function way:
The greatest common denominator is 3
Using the correct in main way:
The greatest common denominator of 12 and 15 is 2293524
frankodwyer给出了一个非常简单的解决方案,就是一些我无法发现或者不知道的小东西,所以返回的不是指针,而是垃圾?
5条答案
按热度按时间iszxjhcz1#
函数greatestCD()的最后一行缺少'return'语句
来吧
(you可能还有进一步的调试工作要做,但这就是它返回垃圾的原因……你没有告诉它还返回什么)
edit:我还建议你在以后编译的时候打开所有的编译器警告......如果你使用的是gcc,那么试着在你的编译命令中添加一个标志 -Wall。当你做的事情可能会导致像这样的bug时,这应该会警告你。(不是每个这样的警告都一定是错误,因此是“警告”,但它通常表示可能的问题。)
pvcm50d12#
由于你正在学习C,独立于你的missing-return bug,这里有一些观察和建议:
malloc()
和free()
时。不要气馁。*打开所有警告,所有时间。如果你可以使用MacOS或Linux,
gcc -Wall -Werror -O
是相当不错的。*在valgrind下运行每个C程序。Valgrind是一个很棒的工具,旨在捕获使用指针时的错误。它会保存你的培根!
祝你好运!
62o28rlo3#
你没有从你的函数返回任何东西,所以值2293524只是随机的垃圾。你的编译器没有给予你一个关于丢失返回值的警告吗?
5cnsuln74#
请参阅问题“我是否应该使用Herb Schildt的书来学习”,特别是在http://www.cs.technion.ac.il/users/yechiel/CS/BadBooksC+C++.html中引用的列表。尽管它列出了Deitel和Deitel的C++书籍,但给定作者对的书籍之间往往有很强的家族相似性。我倾向于给自己买一本关于C的好书。我从Kernighan &里奇那里学到的(第一版,当时只有一个版本),所以我会推荐那个-它简洁准确(就像C本身)。
dgtucam15#
更奇怪的是,该程序在我的linux机器上工作。gcc的一个bug或功能?