为什么用 += 添加到指针有效,而指针 + 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);

+= 与仅在一行中将指针 malloc returns 加 1 有何不同?

malloc的return类型是void *,按照标准不能用于指针运算

然而,有一个 GNU 扩展将 sizeof(void) 视为 1,这就是您的第一个片段编译的原因。后来,pointer - 1 减去 sizeof(int) 而不是 1,因此指针不匹配。

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

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

malloc returns void * 类型。 C标准说:

C11:6.2.5 类型 (p19):

The void type comprises an empty set of values; it is an incomplete type that cannot be completed.

6.5.6 加法运算符(p2):

For addition, either both operands shall have arithmetic type, or one operand shall be a pointer to a complete object type and the other shall have integer type. (Incrementing is equivalent to adding 1.)

void * 指向不完整类型的指针 。因此,void *类型不会进行加法运算。这就是为什么

int *pointer = malloc(sizeof(int)) + 1;  

是错误的,将导致执行 free(pointer - 1);.

时出现 运行 时间错误

看到其他答案,把你的代码改成

int *pointer = (int *)malloc(sizeof(int));

int * pointer = new int[1];

会让你随心所欲。