坚韧的指针和双指针头痛

时间:2014-04-01 17:55:40

标签: c pointers

这就是

int main() 
{

    int number, number2;
    int *ptr, **handle;

    number=1;
    ptr = (int *) malloc(2*sizeof(int)); //points do the heap 
    **handle = number2 + 1; 
    *(*handle+1) = number;
    *ptr = ptr[0] -number2 -2;
    return(0);
}

好吧,它说它存储在堆中的值为-1和1。 除了return(0)之外,我基本上无法理解最后4行代码:)。

3 个答案:

答案 0 :(得分:0)

以下是对最后四行的简短评论。

ptr = (int *) malloc(2*sizeof(int)); // Allocate memory and store the address in ptr.
**handle = number2 + 1; // Put the sum in an arbitrary location in memory, undefined behavior, likely segfault.
*(*handle + 1) = number; // Put number into the address at (*handle) + 1, also arbitrary.
*ptr = ptr[0] -number2 -2; // Set ptr[0] to be ptr[0] - number2 - 2

答案 1 :(得分:0)

**handle = number2 + 1; 
*(*handle+1) = number;

这两行是一个问题,因为handle从未被初始化为指向任何有意义的地方;它包含一个不确定的值,可能会或可能不会解析为内存中的可写位置。

更不用说number2也未初始化,并且还包含不确定的值。 number2 + 1的结果可以是任何东西,它通过指向指针的无效指针分配,指针可以指向任何地方。

如果此代码是任何示例,它是如何编写C代码的示例。

该行

*ptr = ptr[0] -number2 -2;

也有点令人头疼,因为*ptrptr[0]是等价的;不太清楚那条线是什么意思来说明的。

如果最初编写此代码的人希望它以特定方式运行,那么他们依赖的行为是 undefined ;基本上,他们编写的代码的编写方式使得编译器不需要以任何特定的方式处理它。它可以完全任何并被视为"正确"。

答案 2 :(得分:0)

如果实际上这个问题会更有意义:

int number, number2 = 5;
int *ptr, **handle = &ptr;

然后其余的代码会将-11存储在malloc内存中。

我想遗漏handle = &ptr;是某种错字。

对于number2未被初始化,赋值假设变量将被视为初始化为随机值。对于普通系统(例如进行测试的人有经验的系统)可能也是如此,尽管一般情况下并非如此。