簡體   English   中英

關於為C指定偏移量的指針賦值的困惑

[英]Confusion about assigning value to a pointer with offset in C

我手動將整數值賦給一個帶偏移的指針,看來ptr+1實際上並沒有指向second_int ,或者是因為printf函數不知道ptr+1的大小?

#include <stdio.h>

int main(void)
{
    int first_int = 42;
    int second_int = 23;

    int *ptr = &first_int;
    *(ptr + 1) = second_int;

    int i = 0;
    for (i = 0; i < 2; i++) {
        printf("%d\n", *(ptr+i));
    }

    return 0;
}

輸出是:

42
1

不應該是42和23嗎?

我發現每次打印*(ptr+1) ,它都會增加1。

#include <stdio.h>

int main(void)
{
    int first_int = 42;
    int second_int = 23;

    int *ptr = &first_int;
    *(ptr + 1) = second_int;

    int i = 0;
    for (i = 0; i < 10; i++) {
        printf("%d\n", *(ptr+1));
    }

    return 0;
}

輸出是:

0
1
2
3
4
5
6
7
8
9

發生了什么?

編輯:
我只允許使用指針但不允許使用數組(使用Learn C the Hard Way練習)。 所以我通過int *ptr = malloc(sizeof(int) * 2);手動為ptr分配了內存int *ptr = malloc(sizeof(int) * 2); ,然后我將值賦給ptrptr + 1 ,代碼按預期運行。

當您有一個指向單個值的指針時,您只能取消引用它以訪問該特定值,而不是其他值。 為了能夠遞增指針,它必須指向數組內的對象。

例如,這將是有效的:

int integers[2];
int *ptr = &integers[0];

*(ptr + 1) = 2; // Sets integers[1].

你似乎想要設置*(ptr + 1)指向second_int 你可以在C中指向單個值變量的唯一方法是使用地址運算符,因此使用&second_int 但是該值的類型是int* ,而不是int 我想也許你想要的是這樣的:

int first_int = 42;
int second_int = 23;

int *array[2];
array[0] = &first_int;
array[1] = &second_int;
int **ptr = &array[0];

現在您可以使用**ptr*ptr[0]訪問first_int ,使用**(ptr + 1)*ptr[1]來訪問second_int

在您的代碼中, ptr+1不是由您管理的內存。
它可以被其他程序使用,也可以用於任何部分或程序。 這里發生的是編譯器優化了second_int ,因為只使用了它的值。 所以沒有為它分配內存。
幸運的是,內存中的下一個int也由您管理,它是循環的索引。
你以為內存布局是這樣的:
first_int | second_int | i

但它是這樣的:
first_int | i

如果你想能夠用指針+偏移量引用int,那么你必須將它們聲明為數組,以確保它們在內存中是連續的:
int my_ints[2] = { 42, 0};
int *ptr = my_ints;
*(ptr+1) = second_int;
然后您的代碼將按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM