Malloc两次返回相同的指针

时间:2019-03-23 21:32:34

标签: c pointers dynamic-memory-allocation

我这样在main中分配动态数组:

char *arr = malloc(sizeof(char));

然后在随机函数中,将该数组重新分配给n个元素,例如:

arr = realloc(arr, n * sizeof(char));

然后我对数组进行随机处理,在另一个函数中,我想再分配一个包含n个元素的数组,如下所示:

char *arr2 = malloc(n * sizeof(char));

,但是此malloc返回与arr相同的地址。我尝试了所有操作,但仍然返回相同的地址,因此arr2指向arr。我究竟做错了什么? 如果我再次分配新数组,可以使用相同的方法说arr3,那么它现在可以工作了,并且为我提供了新地址。

编辑:

void reallocate(char *arr, int newLength) {
    arr = realloc(arr, newLength * sizeof(char));
}

void fc1 (char *arr, int *length) {
    char *temp = malloc(*length * sizeof(char));
    strcpy(temp, arr);

    int d;
    scanf("%d", &d);

    char *arr2 = malloc(d * sizeof(char)); //there it gives me the same adress 
    scanf("%s", arr2);
}

int main(void) {
    char arr = malloc(sizeof(char));
    int *length = malloc(sizeof(int));
    *length = 10;

    reallocate(arr, 10);
    fc1(arr, length);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

我们需要确定代码,但是有两种可能发生的方式:

data

在这里,console.log(data); 将指针传递到 void func2(char *s) { do_something(s); free(s); // we are done with it } void func1(void) { char * array = some_func(); func2(array); // Oops, func2 frees it char * array2= malloc (...); // could get the same pointer } ,从而将其释放。 func1之后func2做任何事情都是错误的,因为可以重新分配它。

第二种方式:

func1

在这里,array调用 void get_data(char *s) { char *data = // code to get some data from somewhere s = realloc (s, strlen(data) + 1); strcpy(s, data); } void func1(void) { char *ptr = malloc(12); get_data(ptr); // oops, ptr has the old value char *ptr2 = malloc(12); // could get the same pointer } ,但呼叫者仍然拥有get_data可能释放的旧指针。

但是我们需要查看代码以确保确定。

更新

我猜对了。这是我上面的示例中的第二种方式:

realloc

这看起来完全像我上面的realloc函数。此函数不会将void reallocate(char *arr, int newLength) { arr = realloc(arr, newLength * sizeof(char)); } 的新值传递回调用方,因此调用方仍具有可以释放的旧值。

get_data

这看起来就像我上面的第二个arr。您将reallocate(arr, 10); fc1(arr, length); 传递给func1可能会使它无效,但是随后您将arr的旧值传递给reallocate。但是arr可能已经释放了它。有一个原因fc1返回新值,但是您的reallocate函数没有返回。