我正在尝试减少指针,同时将值设置为指针指向的值。 设置值时,它们显示它们已正确设置,但是当尝试再次检索它们时,它不会返回正确的值。为什么会这样,我怎样才能让它工作?
这是我尝试过的代码:
int a = 0;
int* sp = &a;
int* start_sp = &a;
for (int i = 0; i <= n; i++) {
*sp = i;
printf("%d, %d\n", *sp, sp);
sp--;
}
sp = start_sp;
printf("\n");
for (int i = 0; i <= n; i++) {
printf("%d, %d\n", *sp, sp);
sp--;
}
我得到的输出是:
0, 6291028
1, 6291024
2, 6291020
3, 6291016
4, 6291012
0, 6291028
1, 6291024
0, 6291020
6283584, 6291016
0, 6291012
为什么会出现这种情况?
这是为什么,我怎样才能让它工作?
当您访问不属于任何对象的内存时,您会调用未定义的行为。
要工作,您需要使用对象的引用(在本例中是数组的元素)分配指针,并且需要确保
sp - n
引用同一个数组;
int main(void)
{
int n = 5;
int *a = malloc(sizeof(*a) * (n + 1));
int* sp = a - n;
int* start_sp = sp;
for (int i = 0; i <= n; i++) {
*sp = i;
printf("%d, %p\n", *sp, (void *)sp);
sp--;
}
sp = start_sp;
printf("\n");
for (int i = 0; i <= n; i++) {
printf("%d, %p\n", *sp, (void *)sp);
sp--;
}
free(a);
}