通过函数参数与 malloc 混淆

Confusion with malloc through function argument

今天我试图编写一些代码,但我发现自己在某个时候需要分配一个指针所需的内存块。程序没问题,用valgrind检查也没问题。

在我开始审查整个代码后,我意识到我所做的是为 int a 分配的内存,而不是指针。

我是一个学习 C 只是为了好玩的人,我读了一些书和数百本教程,但我从来没有看到任何人提到这样的事情,所以我真的需要一个解释。

我试着做了一个小程序来解释上下文:

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

void createMe(int *a);
void freeMe(int *b);

int main(void){
    int a;
    createMe(&a);
}

void createMe(int *ptr){
    ptr = malloc(256);
    *ptr = 10;
    printf("A = %d\n",*ptr);
    freeMe(ptr);
}

void freeMe(int *ptr){
    free(ptr);
}

这里我有 int a 并且我在 createMe(&a);

中传递了它的地址

create 函数将指针作为参数,因此我不得不使用 &a。 现在对我来说是奇怪的部分:

createMe(); 中,我在那个指针 ptr 上调用 malloc,它是函数的参数。 指针中的内存块 added/used 到底在哪里,它是 create() 函数的参数,或者它发送到 main 中的 a

据我read/learn到现在:

1) a 没有得到那个内存块,因为 a 是一个 int 而不是 int*.

2) 函数参数 ptr 是否获取了内存块?如果是这样,我怎么从来没有读过类似的东西。

我将 Linux mint 17.3GCC-4.8.5GCC-5.2.0

一起使用

这是 Valgrind 的结果:

==6793== Memcheck, a memory error detector
==6793== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==6793== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==6793== Command: ./program
==6793== 
A = 10
==6793== 
==6793== HEAP SUMMARY:
==6793==     in use at exit: 0 bytes in 0 blocks
==6793==   total heap usage: 1 allocs, 1 frees, 256 bytes allocated
==6793== 
==6793== All heap blocks were freed -- no leaks are possible
==6793== 
==6793== For counts of detected and suppressed errors, rerun with: -v
==6793== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

如您所见,内存分配发生了,free 也发生了。

GCC Flags 是:

-Wall -Wextra -Werror -Wstrict-prototypes -Wconversion -Wmissing-prototypes -Wold-style-definition -std=c11 -O0 -g

对于您的代码,

void createMe(int *ptr){
    ptr = malloc(256);
    *ptr = 10;
    printf("A = %d\n",*ptr);
    freeMe(ptr);
}

一直以来,ptr 是您的函数 createMe() 的局部变量。无论您对 ptr(注意,不是 *ptr)本身做任何事情,都不会对 a 产生任何影响。

你在这里做的是

  1. 获取指针类型变量(作为函数参数),没问题。
  2. 动态分配内存,很好。

    2.1。不检查 malloc() 成功,不好。

  3. 正确使用分配的内存,没问题。

  4. 释放记忆,好

你的功能没有任何问题,没关系。

为了详细说明,您正在使用 ptr 就像 createMe() 函数中的另一个局部变量 一样。第一个 malloc() 分配新的内存块给 ptr,无论如何。

在 C 中,参数是按值传递的。 createMe 中的 ptr 指向

之后的新位置
ptr = malloc(256); 

现在 ptr 指向新内存块的开头。