[英]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);
,然后我將值賦給ptr
和ptr + 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.