为什么用 += 添加到指针有效,而指针 + 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
,因此指针不匹配。
进行指针运算时应用的实际偏移量始终取决于指针的类型。由于 pointer
是 int *
,实际偏移量将乘以 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];
会让你随心所欲。
我正在为一个数组分配内存,但我正在移动指针指向的位置。访问元素工作正常。它开始产生释放分配内存的问题。 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
,因此指针不匹配。
进行指针运算时应用的实际偏移量始终取决于指针的类型。由于 pointer
是 int *
,实际偏移量将乘以 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];
会让你随心所欲。