【发布时间】:2014-11-13 12:06:33
【问题描述】:
有两件事我不明白,通常在使用 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,它的值还没有改变,什么继续?
【问题讨论】:
-
转换
malloc的结果是不好的做法。它返回void *的全部意义在于它将隐式转换为您需要的任何类型。 -
至于你问题的第二部分,它是关于未排序的
++和--运算符的近乎日常问题的重复。 -
“我们键入它是因为” - C 自 1970 年以来变得更好
-
有人知道要标记的正确副本吗? SO的搜索没有帮助...
标签: c pointers malloc dynamic-allocation calloc