C语言中的指针及其值

C语言中的指针及其值,c,pointers,cygwin,C,Pointers,Cygwin,好的,这个程序的一部分我必须创建,它基本上是一个游戏,其中创建了一个秘密号码,用户必须尝试并猜测它,而我在指针方面遇到了一些问题。在我的“generate_secret_number”函数中,我在打印指针的值方面没有问题,但是在我的“imTrying”函数中,当我调用generate_secret_number函数并尝试打印指针的值时,我不断收到一个名为“cygwin_exception::open_stackdumpfile:”的错误:我希望有人能给我一些关于我做错了什么的见解,非常感谢 vo

好的,这个程序的一部分我必须创建,它基本上是一个游戏,其中创建了一个秘密号码,用户必须尝试并猜测它,而我在指针方面遇到了一些问题。在我的“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;
(请注意,您可以通过执行以下操作来避免使用
num1
,等等):

*a = (rand() % 5) + 1;
*b = (rand() % 6);
*c = (rand() % 6);
当然,调用函数时,
a
b
c
必须指向有效内存

int num1,num2,num3;
generate_secret_number(&num1,&num2,&num3);
我们看不到呼叫者的呼叫者,但既然你说:

我一直收到一个名为“cygwin_exception::open_stackdumpfile:”的错误:

这可能是因为您的来电者(您没有显示)如下所示:

由于
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);

修改bar的值是毫无意义的(没有双关语)。(指针的值是它所持有的地址)。由于指针
bar
是调用
foo()
的地址的副本,因此
foo()
之外的任何人都不会注意到
bar
发生了变化

相反,您要做的是也更改对象
点:

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

imTrying
是如何调用的?我猜问题是
num1
num2
num3
generate_secret_number
ends时超出了范围,如果希望在函数外部访问它们,则不要初始化函数内部的数字(堆栈上的数字)@dbush现在,它是在主函数中调用的,这样我就可以对它进行测试,我只是使用这个函数来尝试找出如何从另一个函数中获取指针的值(如果有意义)@user10348124这就是你正在做的,但不是如何做的。您需要显示调用该函数的代码,以准确了解问题所在。要调用该函数,它应该是
(&num1,&num2,&num3)
@Jean-Françoisfare谢谢!!如果我要去掉num1、num2等,并将其更改为您建议的(*a=(rand()%5)+1;等),我如何在另一个函数中获得“a”的指针值?我会调用generate_secret_number和printf(“%d”,*a);指针是调用函数时更改值的唯一方法。检查我的上一次编辑(文章片段的结尾)。主调用者只是传递变量的地址,然后打印它们的值
int num1,num2,num3;    // valid memory
imTrying(&num1,&num2,&num3);
printf("%d, %d, %d\n", num1,num2,num3);
foo(int *bar)
{
    bar = 0x42;
}
foo(int *bar)
{
    *bar = 42;
}