Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Malloc返回相同的指针两次_C_Pointers_Dynamic Memory Allocation - Fatal编程技术网

Malloc返回相同的指针两次

Malloc返回相同的指针两次,c,pointers,dynamic-memory-allocation,C,Pointers,Dynamic Memory Allocation,我主要是这样分配动态数组: char *arr = malloc(sizeof(char)); char *arr2 = malloc(n * sizeof(char)); 然后在随机函数中,我将该数组重新分配到n个元素,如: arr = realloc(arr, n * sizeof(char)); 然后我对数组进行随机填充,在另一个函数中,我想再分配一个包含n个元素的数组,如下所示: char *arr = malloc(sizeof(char)); char *arr2 = mal

我主要是这样分配动态数组:

char *arr = malloc(sizeof(char));
char *arr2 = malloc(n * sizeof(char));
然后在随机函数中,我将该数组重新分配到n个元素,如:

arr = realloc(arr, n * sizeof(char));
然后我对数组进行随机填充,在另一个函数中,我想再分配一个包含n个元素的数组,如下所示:

char *arr = malloc(sizeof(char));
char *arr2 = malloc(n * sizeof(char));
但是这个malloc返回与arr相同的地址。我尝试了所有方法,但仍然返回相同的地址,所以arr2指向arr。我做错了什么? 如果我再次分配新的数组,比如说arr3,使用相同的方法,现在它工作了,并给了我新的地址

编辑:


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

 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
传递给
重新分配
,这可能会使其无效,但随后将
arr
的旧值传递给
fc1
。但是,
重新分配
可能已经释放了它。原因是
realloc
返回新值,但是您的
reallocation
函数没有返回新值。

显示您的所有代码,而不仅仅是孤立的部分。您所描述的内容似乎不可能,这意味着您遗漏了一些重要的细节。请发布一条消息,这样我们可以复制问题,从而帮助您调试它。当
n
为零时,这是可能的。strcpy是否释放源数组?您有
char*arr
作为
重新分配()的参数
当它执行
realloc()
时,您不会得到指向
realloc()
提供的新内存区域的指针。您需要通过使
reallocation()
a
void*
返回而不是
void
返回新指针,然后返回
arr
,或者需要使
arr
成为指向指针(
char**arr
)的指针,并像
*arr=realloc(*arr,newLength*sizeof(char))中那样正确地进行解引用;