[英]Why does adding to a pointer with += work, but pointer + 1 doesn't?
我正在为一个数组分配内存,但我正在移动指针向前指向一点点。 访问元素工作正常。 它开始产生释放已分配内存的问题。 Malloc抱怨从未分配被释放的指针。 这个简化的代码可以重现这个问题:
int *pointer = malloc(sizeof(int)) + 1;
free(pointer - 1);
我开始尝试,发现代码的这种轻微变化可以工作。
int *pointer = malloc(sizeof(int));
pointer += 1;
free(pointer - 1);
什么是+ =做不同只是添加1指针malloc返回一行?
malloc
的返回类型是void *
,根据标准,它不能用于指针算术。
但是,有一个GNU扩展,将sizeof(void)
视为1
,这就是你的第一个片段编译的原因。 稍后, pointer - 1
减去sizeof(int)
而不是1
,因此指针不匹配。
进行指针运算时应用的实际偏移量总是取决于指针的类型。 由于pointer
是int *
,因此实际的偏移量将乘以sizeof(int)
。 如果sizeof(void)
为1
或者它是char *
指针( sizeof(char) == 1
),则不会发生乘法。
指针运算可以使用+
或+=
来完成。 它与产生的错误无关。
malloc
返回void *
类型。 C标准说:
void
类型包含一组空值; 它是一种不完整的类型 ,无法完成。
另外,两个操作数都应具有算术类型 ,或者一个操作数应是指向完整对象类型的指针 ,另一个操作数应具有整数类型。 (递增相当于添加1.)
void *
是指向不完整类型的指针 。 因此,不会对void *
类型进行添加。 这就是为什么
int *pointer = malloc(sizeof(int)) + 1;
是错误的,会导致执行free(pointer - 1);
时出现运行时错误free(pointer - 1);
。
看到其他答案,将代码更改为
int *pointer = (int *)malloc(sizeof(int));
要么
int * pointer = new int[1];
会让你做你想做的事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.