今天我试着编写一些代码,我发现我自己在某个时刻需要分配一块指针所需的内存。程序正常,用valgrind
检查也正常。
在我开始回顾整个代码之后,我意识到我所做的,是为int a
分配内存,而不是指针。
我是一个为了好玩而学习的人,我读了一些书和上百个教程,但是我从来没有看到有人提到过这样的事情,所以我真的需要一个解释。
我试着制作一个小程序来解释上下文:
#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);
}
这里我有
C
并且我把它的地址传给了int a
create函数接受一个指针作为参数,因此我必须使用
createMe(&a);
。奇怪的是:
在函数的参数指针上,我调用。
指针中添加/使用的内存块究竟在哪里,它是
&a
函数的参数,还是发送到main中的createMe();
?就我目前为止所读/所学而言:
1)
malloc
没有得到内存块,因为ptr
是一个create()
而不是一个a
。2)函数参数
a
是否得到该内存块?,如果是的话,为什么我从来没有读过这样的东西。我用了
a
和int
和int*
以下是
ptr
的结果:==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)
正如您所看到的,内存分配发生了,而且
Linux mint 17.3
也发生了。GCC-4.8.5
是:-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
产生任何影响。你在这里做的是
获取指针类型变量(作为函数参数),很好。
动态分配内存,很好。
2.1条。不检查是否成功,很糟糕。
正确使用分配的内存,很好。
释放记忆,好吧。
你的功能没有问题,没关系。
为了详细说明,您将
a
用作malloc()
函数中的另一个局部变量。无论如何,第一个ptr
将新的内存块分配给createMe()
。关于c - 通过函数参数与malloc混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34591193/