繁体   English   中英

指针及其在C中的值

[英]Pointers and Their Values in C

好的,所以我必须创建该程序的一部分,基本上这是一个游戏,其中创建了一个秘密号码,用户必须尝试猜测它,并且在指针方面我遇到了一些麻烦。 在我的“ generate_secret_number”函数中,在打印指针的值时没有问题,但是在我的“ imTrying”函数中,当我调用generate_secret_number函数并尝试打印出指针的值时,我一直收到称为“ cygwin_exception”的错误:: open_stackdumpfile:“我希望有人可以让我对我做错的事情有所了解,非常感谢!

void generate_secret_number(int *a, int *b, int *c)
{
    int num1,num2,num3;

    num1 = (rand() % 5) + 1;
    num2 = (rand() % 6);
    num3 = (rand() % 6);

    a = &num1;
    b = &num2;
    c = &num3;

    printf("the secret number is: %d%d%d", *a,*b,*c);
}

void imTrying(int *a, int *b, int *c)
{
    int num1,num2,num3;
    generate_secret_number(a,b,c);
    printf("\n%d", *a);
}

您正在使用局部变量的地址将它们存储在局部指针变量中(无论在函数外部没有任何影响, printf语句都起作用,这会增加幻觉)

a = &num1;
b = &num2;
c = &num3;

而不是将其值复制到通过引用传递的变量中,而是采用适当的方式:

*a = num1;
*b = num2;
*c = num3;

(请注意,您可以通过执行以下操作避免使用num1等):

*a = (rand() % 5) + 1;
*b = (rand() % 6);
*c = (rand() % 6);

当然,调用该函数时, abc必须指向有效内存

int num1,num2,num3;
generate_secret_number(&num1,&num2,&num3);

我们没有看到呼叫者的呼叫者,但是由于您说:

我不断收到名为“ cygwin_exception :: open_stackdumpfile:”的错误。

这可能是因为您的来电者(您未显示)就像:

int *a,*b,*c;
imTrying(a,b,c);

由于由a指向的地址未初始化, 由于其他错误而未正确写入,因此当您尝试打印该值时,程序将以未定义的行为崩溃。

要解决此问题,请根据您的情况:

void imTrying(int *a, int *b, int *c)
{
    // int num1,num2,num3;  // useless
    generate_secret_number(a,b,c);        
}

呼叫者:

int num1,num2,num3;    // valid memory
imTrying(&num1,&num2,&num3);
printf("%d, %d, %d\n", num1,num2,num3);

foo(int *bar)
{
    bar = 0x42;
}

修改bar的值将毫无意义(无双关语)。 (指针的值是它保存的地址)。 由于指针bar是地址的副本foo()被调用时,没人外foo()根本注意,这bar改变。

您要做的是也更改对象bar点:

foo(int *bar)
{
    *bar = 42;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM