在C语言中,如何给函数分配内存?

今天我学到 函数指针了
我看到书上说
指针p可以指向函数的入口地址
这些我都理解
我想问的是 程序在编译完了之后 是不是就预先给
里面所有的函数分配好了内存呢? 虽然没有正式分配 但是预备着了
我这样理解对不对啊
#include<stdio.h>
int max(int m, int n);
void main() {
int (*p)(int, int);
int a, b, c;
p = max;
scanf("%d,%d",&a, &b);
c = (*p)(a, b);
printf("%d\n",c);
}

int max(int m, int n) {

return m>n ? m:n;
}
可是我在群里问的时候 有人说不对 说 内存分配是未知的
我觉得虽然没有真正给max分配内存地址 但是应该给他拟定好了 如果不拟定了好了
整个程序执行的时候 max代表的入口地址从何而来啊
我理解的对不对啊
求求各位了 我零基础自学。。。。 拜托了!!!!

函数的相对地址在编译链接的时候就已经分配好了,但是绝对地址是未知的。就是说,函数的地址相对于程序基址的偏移是确定的,但是程序在运行的时候,会被加载到哪一个区域运行是不确定的,需要由操作系统根据内存的使用的情况等进行调度,所以函数在内存中的绝对地址也就自然不确定了,希望可以帮到你。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-05-25
函数原型void *malloc (long numbytes)
举例:创建100个字节的内存大小
char *buffer = (char*)malloc(100);
第2个回答  2011-03-21
一个程序编译成二进制文件(可执行文件或库文件)后,其中某个函数在这个二进制文件中的位置就固定了,当运行这个程序或把这个库加载到内存时,该函数的地址就等于程序或库的起始地址加上该函数在该二进制文件中的偏移量。
第3个回答  2011-03-21
你的理解很正确。对exe来说,编译完之后,函数的地址空间就已经确定了。实际的内存分配发生在模块被加载的时候(即你运行这个程序的时候)。
对于动态连接库(就是DLL)来说,稍微有点区别。如果模块之间发生地址冲突,操作系统会对dll里的函数地址重定位。
第4个回答  2015-07-02
不知lz有没听说过虚存一说,当源码被编译成二进制文件后,其中的变量,函数的虚拟地址,也就是内存空间中的地址就已确定,在运行时,操作系统为其分配物理内存并添加虚拟地址到物理地址的映射。
再说的多一点,一个进程(运行的程序)可分为若干段:代码段、数据段、堆栈段等,其中函数所操作的空间(也就是局部变量的空间)就位于堆栈段,所谓函数分配内存大小,实际就是堆栈段指针的变化而已。

malloc函数的用法
1. 确定所需内存大小:使用变量来指定需要的内存字节数。2. 调用malloc函数:使用malloc函数分配内存,并将返回值保存到一个变量中。例如,int *ptr = malloc。3. 检查返回值:确保malloc函数返回的指针不是NULL,这表示内存分配成功。如果返回NULL,则表示内存分配失败。4. 使用指针操作内存:通过指针访...

C语言问题:内存的分配方式有哪几种?
内存分配方式有三种:[1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。[2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,...

c语言数组在内存中是怎么分配的
使用C语言编程,实际上使用的内存只有一种虚拟内存。根据功能的不同在C语言中又将虚拟内存为分三类:栈区、堆区、静态数据区,无论单一变量还是数组,其内存分配都是如此;1、栈区:一般每一个函数对应一个栈区,在编译原理中称为栈帧;2、静态数据区:这实际上对应于生成的可执行文件的data区段,...

c语言数组在内存中是怎么分配的?
C语言使用的内存是虚拟内存。按照功能的不同在C语言中又将虚拟内存为分三类:栈区、堆区、静态数据区,不管是单一变量还是数组,其内存分配都是这样分的。在栈区、静态数据区、堆区会有编译器负责分配、操作系统负责管理,程序员可以在堆区使用malloc()来动态分配堆内存的问题。

c语言中malloc函数的用法
malloc函数是C语言中的一种动态内存分配函数。它可以在程序运行时动态地分配内存空间,使程序具有更大的灵活性和可扩展性。使用malloc函数可以在程序运行时动态地分配内存空间。例如,下面的代码片段可以申请一个大小为10个整形变量大小(即40个字节)的连续内存空间,并将其首地址赋给指针变量p。在程序运行...

C语言中分配内存的函数是怎么写的?
在大部分操作系统中,内存分配由以下两个简单的函数来处理:void *malloc (long numbytes):该函数负责分配 numbytes 大小的内存,并返回指向第一个字节的指针。void free(void *firstbyte):如果给定一个由先前的 malloc 返回的指针,那么该函数会将分配的空间归还给进程的“空闲空间”。malloc_init 将...

c语言中malloc是什么?怎么用?
【参数说明】size 为需要分配的内存空间的大小,以字节(Byte)计。【函数说明】malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。如果希望在分配内存的同时进行初始化,请使用 calloc() 函数。【返回值】分配成功返回指向该内存...

c语言malloc函数?
在C语言中,malloc函数是一个标准库函数,用于在程序的运行期间动态地分配内存。它接受一个参数,即要分配的字节数,并返回一个指向新分配内存的指针。如果内存分配成功,该指针可以用于访问新分配的内存区域。如果内存分配失败,malloc返回NULL指针。malloc函数的作用机制 当程序需要更多的内存空间来存储变量...

malloc在c语言中是什么意思
C语言中malloc是动态内存分配函数。首先,malloc函数的用法非常简单,只需要在代码中调用该函数并传入所需的内存大小即可。malloc函数的原型如下:```cvoid*malloc(size_tsize);```。其中,size是要分配的内存块的字节数。malloc函数会在堆(heap)中为这块内存分配空间,并返回一个指向该内存块的...

C语言的内存分配calloc()函数
C语言中,内存分配手段多样,除了广泛应用的malloc()函数,calloc()函数也扮演着重要角色。在C标准ANSI之前,calloc()返回指向char的指针,但现在通常是返回void指针,需要配合类型转换。它的用法是接受两个无符号整数参数,其中第一个表示所需存储单元的数量,第二个表示每个单元的字节数。例如,当用于存储...

相似回答