为什么递减指针不能返回正确的值?

问题描述 投票:0回答:1

我正在尝试减少指针,同时将值设置为指针指向的值。 设置值时,它们显示它们已正确设置,但是当尝试再次检索它们时,它不会返回正确的值。为什么会这样,我怎样才能让它工作?

这是我尝试过的代码:

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

为什么会出现这种情况?

c pointers memory-address decrement
1个回答
0
投票

这是为什么,我怎样才能让它工作?

当您访问不属于任何对象的内存时,您会调用未定义的行为。

要工作,您需要使用对象的引用(在本例中是数组的元素)分配指针,并且需要确保

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.