C中的指针偏移量

时间:2015-11-24 11:00:14

标签: c pointers

在网上阅读有关C语言的一些教程时,我发现以下代码为长度数组(n1-n0 + 1)分配内存。我无法弄清楚添加此指令的方式和原因:v -= n0;有效。这是代码:

double *AllocVector(int n0, int n1)
{
    double *v;
    int i;

    v = malloc((n1-n0+1) * sizeof(double));
    if (!v)
        printf("Error allocating memory in AllocVector");

    /* Initiate */

    v -= n0;
    for (i = n0; i <= n1; i++)
        v[i] = 0.0;

    return v;
}

3 个答案:

答案 0 :(得分:0)

您正在调用未定义的行为。在这一点上,所有赌注都已关闭,任何事情都可能发生。

我碰巧出现正常工作是可能发生的事情之一。

答案 1 :(得分:0)

代码v -= n0;导致undefined behaviour,因为不允许在分配的内存之外的任何地方使用指针点(空指针除外)。

在某些系统上,它似乎可行;编译器为v - n0 + n0发出的汇编指令可能会生成v,依此类推。

答案 2 :(得分:0)

这里 >未定义的行为:变量v在本地声明,它分配空间但不初始化它。 v中有一些随机值。换句话说,你无法知道v中存储了什么。因为它是指向双精度的指针,你不知道它指向的位置。

当你写v - = n0;你说的是向前移动&#39;从v指向的地址为n0#的双打,并将该地址存储在v。由于你不知道v 指向的位置,你无法知道v现在指向哪里。

然后你通过写v [i] = 0.0取消引用v;因为你不知道v点在哪里你不知道你在哪里写值0.0。

你在某处写了0.0,如果某个地方是你有权访问的内存位置而且你没有将它用于其他任何地方,那么该程序似乎正常工作。然后将其移动到新计算机或修改代码, poof v现在指向新的内存位置,程序崩溃。