Malloc两次返回相同的指针[重复]

问题描述 投票:-2回答:1

这个问题在这里已有答案:

我在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;
}
c pointers dynamic-memory-allocation
1个回答
0
投票

我们需要确定代码,但是有两种方法可以实现:

 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_datarealloc,但来电者仍然有旧指针,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可能已经释放了它。有一个原因realloc返回新值,但你的reallocate函数没有。

© www.soinside.com 2019 - 2024. All rights reserved.