Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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
如果在同一个指针(C)上使用malloc两次会发生什么?_C_Pointers_Memory_Malloc - Fatal编程技术网

如果在同一个指针(C)上使用malloc两次会发生什么?

如果在同一个指针(C)上使用malloc两次会发生什么?,c,pointers,memory,malloc,C,Pointers,Memory,Malloc,比如说,我创建了一个指针newPtr,我使用malloc(一些大小),然后我再次使用同一个指针使用malloc(一些大小)。会发生什么?然后我是否创建了与第一个内存块大小相同的第二个内存块?newPtr指向同一地址吗 例如: int *newPtr; newPtr = malloc(10 * sizeof(int)); newPtr = malloc(10 * sizeof(int)); 您的程序将出现内存泄漏。newPtr的第一个值将丢失,您将无法释放它 然后我是否创建了与第一个内存块大小相

比如说,我创建了一个指针newPtr,我使用malloc(一些大小),然后我再次使用同一个指针使用malloc(一些大小)。会发生什么?然后我是否创建了与第一个内存块大小相同的第二个内存块?newPtr指向同一地址吗

例如:

int *newPtr;
newPtr = malloc(10 * sizeof(int));
newPtr = malloc(10 * sizeof(int));

您的程序将出现内存泄漏。
newPtr
的第一个值将丢失,您将无法
释放它

然后我是否创建了与第一个内存块大小相同的第二个内存块

对。您正在分配第二个对象,与第一个对象不同

newPtr指向同一地址吗


不。对象是不同的,因此它们的地址是不同的。

您实际上没有在同一指针上使用
malloc
。您根本没有给malloc提供
malloc
指针<代码>malloc
始终分配新内存。因此,与任何变量赋值的情况相同:

int a;
a = 14;
a = 20;
14
会发生什么情况?你不能再访问它了。就
malloc
而言,这意味着您不再有对它返回的指针的引用,因此将出现内存泄漏

如果您确实想使用“
malloc
”和同一个指针,您可能会对以下函数感兴趣:

int *newPtr;
newPtr = malloc(10 * sizeof(int));
newPtr = realloc(newPtr, 10 * sizeof(int)); //*might leak memory*
从该链接:
realloc
“更改ptr指向的内存块的大小。函数可以将内存块移动到新位置(其地址由函数返回)。”


编辑:请注意,如果
realloc
在上述操作中失败,则返回NULL,但
newPtr
指向的内存未被释放。基于,您可以执行以下操作:

void *emalloc(size_t amt){
    void *v = malloc(amt);  
    if(!v) {
        fprintf(stderr, "out of mem\n");
        exit(EXIT_FAILURE);
    }
    return v;
}
void *erealloc(void *oldPtr, size_t amt){
    void *v = realloc(oldPtr, amt);  
    if(!v) {
        fprintf(stderr, "out of mem\n");
        exit(EXIT_FAILURE);
    }
    return v;
}
然后:

int *newPtr;
newPtr = emalloc(10 * sizeof(int));
newPtr = erealloc(newPtr, 10 * sizeof(int));
您不是“在同一个指针上使用malloc”。您正在调用
malloc()
(分配空间并返回指向该空间的指针),并将其返回值分配给同一个指针对象。(
malloc
本身不知道如何处理它返回的结果。)

与任何赋值一样,第二个赋值将替换以前存储的值

这意味着,除非您将它保存到其他地方,否则您不再有指向第一个分配内存块的指针。这是一个很好的例子


此外,您应该始终检查
malloc
返回的结果是否为空指针,如果是,请采取一些纠正措施。在最简单的情况下,这可能只是打印错误消息并终止程序。您绝对不应该假定
malloc
调用成功,然后尝试使用(不存在的)分配内存。(这与您的问题无关,但它很容易被忽略,特别是因为在大多数情况下分配失败很少。)

这些语句没有在
newPtr
上使用malloc

语句
newPtr=malloc(10*sizeof(int))导致以下操作:

  • sizeof(int)
    进行计算
  • 该值乘以10
  • malloc
    被调用,并将该产品传递给它
  • malloc
    返回一个值
  • 该值被分配给
    newPtr
  • 因此,您可以看到,在步骤3,
    newPtr
    没有以任何方式涉及。只有在
    malloc
    完成后,才会涉及
    newPtr

    当您第二次调用
    malloc
    时,它无法知道您正在使用
    newPtr
    执行任何操作。它只分配新空间并返回指向它的指针。然后,新指针被分配给
    newPtr
    ,这将擦除
    newPtr
    中的旧值


    此时,您无法知道旧值是什么。空间仍然被分配,因为它没有被释放,但您没有指向它的指针。

    您要学习的关键点是,您不会“在指针上使用malloc”。我问的原因是我试图理解链表。指针指向一个结构。那么我应该使用malloc吗?指针和malloc都很好,问题是使用“指针上的malloc”不是你要做的。指针可以指向您希望它指向的任何对象,并且
    malloc
    返回一个它根据您的请求分配内存的地址。在您的示例中,如果
    realloc
    失败(返回
    NULL
    ),该怎么办?内存泄漏@哎呀,糟透了。抢手货尽管如果
    malloc
    realloc
    失败,您可能已经筋疲力尽,但最好明确地处理它。