指针算术和malloc()/ calloc()函数

时间:2014-09-19 00:52:27

标签: c pointers malloc dynamic-allocation calloc

有两件我不理解的事情,通常在使用malloc()/ calloc()时我们输入它,因为它们返回一个void指针,所以我们输入它来转换为我们的指针类型所以我们可以用它做指针算术。 所以我已经创建了一个代码示例,我使用malloc()并且我没有输入它并且指针算法仍然有效:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *p = malloc(8);
    *p++ = 30;
    *p = 40;
    printf("p points to address [%p] which holds a value of %d, p points to address [%p] which holds a value of %d\n", p, *p++, p, *p--);
    return 0;
}

为什么会这样?

我的关于指针算术的另一个问题是我上面给你看的代码,我最初写的如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *p = malloc(8);
    *p++ = 30;
    *p-- = 40;
    printf("p points to address [%p] which holds a value of %d, p points to address [%p] which holds a value of %d\n", p, *p++, p, *p--);
    return 0;
}

注意区别是* p-- = 40。 我使用p--因为我想打印指针指向的正确地址,我假设在使用p ++之后我需要使用p--所以指针将指向值的地址30,但如果我添加了p--并打印出来,我发现它打印了另一个值。 所以这里的某些内容并没有为我点击它发生了什么?此外,如果我删除 - 然后打印,它打印30和40然后我预期但地址保持不变,我预计它是以前的地址+ 4,它还没有价值改变了,发生了什么?

http://imgur.com/GRRInBL

1 个答案:

答案 0 :(得分:0)

指针算法取决于声明指针的类型。由于您的指针为int *,因此++--将按sizeof(int)递增和递减指针的(原始)值,以便您可以访问相邻的int }值。

在C中,可以将void *分配给另一种类型的指针(例如int *),而不会触发警告(在C ++中不是这样)。在这种情况下,强制转换由编译器执行。