[英]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.