初学C程序员需要指针帮助(我认为)

时间:2008-12-26 19:04:00

标签: c pointers

我是初学程序员,我正在学习我的第一语言C.

我主要是从Deitel和Deitel的C How to Program一书中学习,但也使用了大学的示例任务和事情,但是我被困在一个。

我对指针非常基本的了解 - 添加&在变量前面使它打印一个地址,*使用指针来使用存储在该地址的值等。

我编写的这段代码用于计算两个数字的最大(最大?)公分母,实际上并不需要或涉及指针。它使用两个函数,逻辑是正确的,因为如果我从第二个函数执行它,它会打印出正确的屏幕答案,而不是将它返回到main。这就是问题所在。

当第二个函数返回答案值时,由于某种原因它返回我只能假设的指针。我不知道为什么会这样做。我将能够使用它并将其转换为查找值 - 但它似乎是第二个函数的本地指针并被写入。网上没有任何我能找到或在我的书中的任何内容让我知道如何解决问题。

谢谢你,如果你已经读到这么远了。我絮絮叨叨太多了。

这是我的代码和输出。任何帮助或指针(借口双关语)将不胜感激。我知道我可以在第二个函数中打印它,但我更愿意知道它是如何以及为什么它不会像我希望的那样返回值。

代码

#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 个答案:

答案 0 :(得分:10)

您在函数largestCD()

的最后一行中缺少'return'语句
greatestCD(num2,(num1%num2));

成功

return greatestCD(num2,(num1%num2));

(你可能还有进一步的调试要做,但这就是为什么它会返回垃圾......你不会告诉它还有什么可以返回)

编辑:我还建议在将来编译时打开所有编译器警告...如果你正在使用gcc,那么尝试将标志 -Wall 添加到编译命令中。当你做的事情可能会导致像这样的错误时,这应该警告你。 (并非每一个这样的警告都是必然的错误,因此是“警告”,但它通常表示可能存在问题。)

答案 1 :(得分:4)

由于您正在学习C,独立于您的遗失 - 返回错误,以下是一些观察和建议:

  • 指针是学习语言最难的功能,尤其是当您进入malloc()free()时。 不要气馁

  • 扔掉Deitel和Deitel,给自己一份Kernighan and Ritchie 。这是有史以来最好的语言书之一。

  • 始终打开所有警告。如果您可以使用MacOS或Linux,gcc -Wall -Werror -O非常好。

  • valgrind 下运行每个C程序。 Valgrind是一个很棒的工具,旨在以使用指针的方式捕获错误。它会保存你的培根!

祝你好运!

答案 2 :(得分:2)

您不会从函数返回任何内容,因此值2293524只是随机垃圾。你的编译器不会给你一个关于缺少返回值的警告吗?

答案 3 :(得分:2)

查看问题Should I Not Use a Herb Schildt Book to Learn From,特别是http://www.cs.technion.ac.il/users/yechiel/CS/BadBooksC+C++.html引用的列表。虽然它列出了Deitel和Deitel的C ++书籍,但是给定的一对作者在书籍之间往往存在强烈的家族相似性。我倾向于给自己写一本关于C的好书。我从Kernighan&amp; amp; Ritchie(第一版,当时只有一个版本),所以我建议 - 它简洁而准确(就像C本身一样)。

答案 4 :(得分:0)

更奇怪的是该程序适用于我的linux机器。 gcc的错误或功能?

/dev/shm $ gcc x.c
/dev/shm $ ./a.out
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 3
/dev/shm $ gcc --version
gcc (Debian 4.3.2-1) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.