通过函数参数与 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.3
与 GCC-4.8.5
和 GCC-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
产生任何影响。
你在这里做的是
- 获取指针类型变量(作为函数参数),没问题。
动态分配内存,很好。
2.1。不检查 malloc()
成功,不好。
正确使用分配的内存,没问题。
- 释放记忆,好
你的功能没有任何问题,没关系。
为了详细说明,您正在使用 ptr
就像 createMe()
函数中的另一个局部变量 一样。第一个 malloc()
分配新的内存块给 ptr
,无论如何。
在 C 中,参数是按值传递的。 createMe
中的 ptr
指向
之后的新位置
ptr = malloc(256);
现在 ptr
指向新内存块的开头。
今天我试图编写一些代码,但我发现自己在某个时候需要分配一个指针所需的内存块。程序没问题,用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.3
与 GCC-4.8.5
和 GCC-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
产生任何影响。
你在这里做的是
- 获取指针类型变量(作为函数参数),没问题。
动态分配内存,很好。
2.1。不检查
malloc()
成功,不好。正确使用分配的内存,没问题。
- 释放记忆,好
你的功能没有任何问题,没关系。
为了详细说明,您正在使用 ptr
就像 createMe()
函数中的另一个局部变量 一样。第一个 malloc()
分配新的内存块给 ptr
,无论如何。
在 C 中,参数是按值传递的。 createMe
中的 ptr
指向
ptr = malloc(256);
现在 ptr
指向新内存块的开头。