改变使用malloc创建的指针的地址

时间:2016-04-24 19:13:16

标签: c pointers

我试图理解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应该能够保存任何整数地址,但代码会抛出错误。你能解释一下这是错误的吗?

由于

2 个答案:

答案 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;
    }
}