簡體   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