我试图理解malloc和指针是如何工作的。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p;
int b = 15;
p = (int *)malloc(sizeof(int) * 10);
for (int i = 0; i < 5; i++) {
p + i = &b;
}
}
上面的代码给出了错误 表达式不可分配 p + i =&amp; b;
据我所知,malloc给出了在堆中分配的内存的起始地址,我将其转换为保存整数的地址。所以从技术上讲,p + i应该能够保存任何整数地址,但代码会抛出错误。你能解释一下这是错误的吗?
由于
答案 0 :(得分:0)
代码行p = (int *)malloc(sizeof(int) * 10);
表示为指针p分配了动态分配的数组的第一个元素的地址malloc()
,该数组已分配一个由{10}组成的int
数组元件。
如果你想为这些元素中的5个分配b
的值,那么你写下:
for (int i = 0; i < 5; i++) {
p[i] = b;
}
但是,如果你想要一个包含10个整数指针的数组,并希望为其中的5个分配b
的地址,那么你写下:
int **pointer = (int **)malloc(sizeof(int *) * 10);
for (int i = 0; i < 5; i++) {
pointer[i] = &b;
}
完成后不要忘记释放动态分配的内存。
答案 1 :(得分:0)
p + i
指向内存中的地址,与&(p[i])
相同。你不能改变内存的地址,这就是编译器说这个表达式不可分配的原因。
如果您想在该地址上保存int
,则需要使用*(p+i) = b
。
但是如果您想要保存int
的地址,则需要一个包含int*
的数组,因此您需要将p
声明为int**
并分配记忆sizeof(int*)
。这样你的代码就像这样:
#include <stdio.h>
#include <stdlib.h>
int main() {
int **p;
int b = 15;
p = (int**)malloc(sizeof(int*) * 10);
for (int i = 0; i < 5; i++) {
*(p + i) = &b;
}
}