【问题标题】:Testing function with pointer parameter C带有指针参数 C 的测试函数
【发布时间】:2018-09-20 02:00:39
【问题描述】:

我这周开始学习 C,这是我遇到的第一个困难。

我想测试一下这个功能:

void    ft_ultimate_div_mod(int *a, int *b)
    {
        int *tmp;

        if (b != 0)
        {
            *tmp = *a % *b;
            *a = *a / *b;
            *b = *tmp;
        } 
}

但我无法弄清楚主要使用指针。我的程序没有打印任何内容:

int     main(void)
{
    int *a;
    int *b;

    *a = 5;
    *b = 3;

    ft_ultimate_div_mod(a, b);
    printf("%d", *a);
    printf("%d", *b);

    return (0);

}

我能做什么?谢谢!

【问题讨论】:

  • 不要在main中声明指针并使用地址操作符&
  • @UnholySheep 我删除了 *'s 并打电话给 ft_ultimate_div_mod(&a, &b) 没有运气
  • int* tmp; 也应该是int tmp;(并从所有tmp 的使用中删除*
  • b 是一个指针。你是说 if (*b != 0) 吗?
  • @purec 你是对的。他的意思是 *b != 0.:)

标签: c function pointers testing main


【解决方案1】:

对于初学者来说,将变量tmp 声明为具有int * 类型是没有意义的。该变量用于存储int 类型的对象,因此它必须具有int 类型。否则,您使用的未初始化指针具有不确定的值,会导致程序的未定义行为。

由于变量用在 if 语句的复合语句中,所以它应该在 if 语句的 blco 范围内声明。

main 中的这些声明

int *a;
int *b;

als 没有意义。

你的意思是以下。

#include <stdio.h>

void    ft_ultimate_div_mod(int *a, int *b)
{
    if ( *b != 0 )
    {
        int tmp = *a % *b;
        *a = *a / *b;
        *b = tmp;
    } 
}

int main(void) 
{
    int a = 10;
    int b = 3;

    ft_ultimate_div_mod( &a, &b );

    printf( "%d %d\n", a, b );

    return 0;
}

函数ft_ultimate_div_mod 通过引用排除了它的参数,因为它试图改变它们的原始值。

【讨论】:

  • 非常感谢您对参考资料的解释,这就是我需要的答案。
【解决方案2】:

您在函数中声明 int *tmp。那是指向可以存储 int 的 int 大小的内存位的指针。但是,您永远不会将其指向任何地方,因此 *tmp = *a % *b; 将执行 a 和 b 的 mod,然后在使用未初始化的指针存储它时崩溃。

*tmp 更改为 tmp,这样你的代码就变成了:

void ft_ultimate_div_mod(int *a, int *b)
{
    int tmp;

    if (a && b)
    {
        tmp = *a % *b;
        *a = *a / *b;
        *b = tmp;
    } 
}

【讨论】:

    猜你喜欢
    • 2018-01-03
    • 2015-09-03
    • 1970-01-01
    • 2015-02-18
    • 2019-10-20
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多