今天我尝试编写代码,我发现自己在某些时候需要为指针分配一块内存。程序没问题并且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
没有得到那个内存块,因为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
答案 0 :(得分:2)
如果是您的代码,
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
。
答案 1 :(得分:1)
在C中,参数按值传递。 <{1}}中的ptr
指向
createMe
现在ptr = malloc(256);
指向新内存块的开头。