【问题标题】:Confusion with malloc through function argument通过函数参数与 malloc 混淆
【发布时间】:2016-04-08 01:38:12
【问题描述】:

今天我正在尝试编写一些代码,但我发现自己有时需要为指针分配一块内存。程序没问题,用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(&amp;a);中传递了它的地址

create 函数将指针作为参数,因此我必须使用&amp;a。 现在对我来说奇怪的部分来了:

createMe(); 内,我在该指针ptr 上调用malloc,这是函数的参数。 在作为create() 函数的参数的指针中添加/使用的内存块到底在哪里,或者它在main 中发送到a

就我到现在为止的阅读/学习而言:

1) a 没有获得该内存块,因为 aint 而不是 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

【问题讨论】:

  • 提示:这里根本不需要a。尝试传递NULL。它也能正常工作。
  • @cad 感谢您的回复。我在问是否可以为函数参数创建一块内存。我从来没有读过那样的东西。 :)

标签: c pointers malloc parameter-passing


【解决方案1】:

如果是您的代码,

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. 释放内存,很好。

你的函数没有任何问题,没关系。

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

【讨论】:

  • 这意味着您可以为作为函数参数的指针添加内存块?我从来没有读过。
  • 就像我说的,刚刚创建了一个小程序,我总是检查指针是否为 NULL。我希望这个问题很明显:)
  • 根据您的回答,我可以在 int 的任何变量上调用该函数,它不会造成任何伤害。我理解对了吗?
  • @Michi 是的,你是对的,只要你保持这个函数定义不变。 :)
  • 是的。我必须等待 5 分钟才能接受。谢谢。
【解决方案2】:

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

ptr = malloc(256); 

现在ptr 指向一个新内存块的开始。

【讨论】:

  • 是的,这和我想的完全一样,ptr 指向一个新位置,但是当我看到时我很困惑,通过那个指针我仍然可以更新值amain.
  • @Michi;不会。一旦ptr 更新,它就没有a 的位置信息。
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
相关资源
最近更新 更多