2

我有一个问题......可以说我有以下部分代码:

int *a,*a1,*a2;
for (i=1; i<=2; i++) {
    a=malloc(sizeof(int));
    if (i==1) a1=a;
    else if (i==2) a2=a;
}
*a1=5;
*a2=4;

所以我的问题是,如果我使用 printf 打印 a1 和 a2 变量 a1 的值将是 5 而 a2 的值是 4 ?因此,如果我使用 malloc 分配内存和该内存空间中的 a 点,然后再次使用 malloc 分配内存,那么 a 指向内存的不同部分,但内存的第一部分仍然存在?或者如果我再次使用 malloc ,它将擦除内存的第一部分,并将写入内存的新部分

4

4 回答 4

10

每次调用malloc都会返回一个指向不同内存的指针,直到您调用free以释放该内存。

于 2013-01-09T14:07:16.507 回答
3

如果我使用 printf 打印 a1 和 a2 变量 a1 将具有值 5 而 a2 将具有值 4 ?

嗯……不。

a1(类型为int *,即指向整数的指针)将包含第一次调用malloc().

a2(和a),也是指针类型,将包含第二次调用产生的地址malloc()

中的地址a1将指向一个整数,您为其分配了值 5。

(and )中的地址将指向一个整数,您为其分配了值 4。a2a

free()这两个整数都将保持分配状态,直到您通过调用它们的地址来释放它们。注意:调用 eg 后free( a2 ),不再分配整数。free()在同一个地址上再次调用(例如通过free( a ),或通过free( a2 )第二次调用)将导致未定义的行为(即,如果你很幸运,你的程序会崩溃)。

指针是地址值。看来这就是您的困惑的来源:它与它所指向的事物不同。

于 2013-01-09T14:10:07.243 回答
0

我相信你的问题的答案是肯定的。Malloc'ing 将为您提供具有(至少)指定大小(如果可用)的内存位置。它不会释放任何内存,只会给你更多(用于free()释放 malloc 的内存)。

您正在使用一些临时变量这一事实a没有意义。在这个循环结束时a == a2 != a1

于 2013-01-09T14:07:32.513 回答
0

如果我使用 printf 打印 a1 和 a2 变量 a1 将具有值 5 而 a2 将具有值 4 ?

是的,你是对的。不过,这是一个有点奇怪的问题,因为试看比问更容易。

因此,如果我使用 malloc 分配内存和该内存空间中的 a 点,然后再次使用 malloc 分配内存,那么 a 指向内存的不同部分,但内存的第一部分仍然存在?

那是对的。malloc()分配“存在”的内存,直到您使用释放它free(),或者执行realloc()可能将您的数据移动到不同内存并释放旧内存位置的内存。我建议您阅读一些有关它的文档。至少手册页

此外,您的代码有错误。您使用赋值而不是比较并且i未定义变量。这是一个更正的版本,带有printf()

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *a,*a1,*a2;
    int i;

    for (i=1; i<=2; i++) {
        a = malloc(sizeof(int));
        if (i==1)
            a1 = a;
        else if (i==2)
            a2 = a;
    }
    *a1=5;
    *a2=4;

    printf("a1=%d, a2=%d\n", *a1, *a2);

    free(a1);
    free(a2);

    return EXIT_SUCCESS;
}

希望能帮助到你。祝你好运!

于 2013-01-09T14:12:18.233 回答