通过函数参数与malloc混淆

时间:2016-01-04 12:28:42

标签: c pointers malloc parameter-passing

今天我尝试编写代码,我发现自己在某些时候需要为指针分配一块内存。程序没问题并且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();内我在该指针malloc上调用ptr,这是函数的参数。 确切地说,在指针中添加/使用的内存块是create()函数的参数,还是发送到main中的a

直到现在我读/学:

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

2)函数参数ptr是否得到那个内存块`?,如果是这样的话,我怎么会读不到那样的内容。

我将Linux mint 17.3用于GCC-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

2 个答案:

答案 0 :(得分:2)

如果是您的代码,

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. 释放记忆,很好。
  5. 你的功能没有任何问题,没关系。

    只是详细说明,您在ptr函数中使用createMe() 作为另一个本地变量。无论如何,第一个malloc()将新的内存块分配给ptr

答案 1 :(得分:1)

在C中,参数按值传递。 <{1}}中的ptr指向

之后的新位置
createMe

现在ptr = malloc(256); 指向新内存块的开头。