今天我试着编写一些代码,我发现我自己在某个时刻需要分配一块指针所需的内存。程序正常,用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是否得到该内存块?,如果是的话,为什么我从来没有读过这样的东西。
我用了aintint*
以下是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/

10-11 23:20
查看更多