繁体   English   中英

为什么添加指针+ = work,但指针+ 1不?

[英]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 ,因此指针不匹配。

进行指针运算时应用的实际偏移量总是取决于指针的类型。 由于pointerint * ,因此实际的偏移量将乘以sizeof(int) 如果sizeof(void)1或者它是char *指针( sizeof(char) == 1 ),则不会发生乘法。

指针运算可以使用++=来完成。 它与产生的错误无关。

malloc返回void *类型。 C标准说:

C11:6.2.5类型(第19页):

void类型包含一组空值; 它是一种不完整的类型 ,无法完成。

6.5.6加法运算符(p2):

另外,两个操作数都应具有算术类型 ,或者一个操作数应是指向完整对象类型指针 ,另一个操作数应具有整数类型。 (递增相当于添加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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM