函数返回指针 c function pointers
2025-09-23 02:31:10 | 世界杯足球队 | admin | 8861°c
这个函数
char *alloc(int n) /*return pointer to n charachters*/
将返回一个指向字符的指针
如果这样写可能更容易理解:
char* alloc(int n) //subtle, but this change in format can help
现在,关于指针实际指向的内容。之前,在这一行上;
#define ALLOCSIZE 1000
static char allocbuf[ALLOCSIZE];
创建了一个大小为1000的字符数组。我们有一个由1000个字符组成的数组,名称为“allocbuf”,指向数组中第一个元素。
接下来,在这一行中;
static char *allocp = allocbuf;
我们创建一个指向1,000 char数组(allocbuf)的第一个元素的指针(allocp)。这两个变量都是全局变量,可以在程序的任何地方访问。在您发布的示例中,这些变量将用于alloc函数。
在继续之前,定义函数的目的是有意义的。目的是使用先前定义的1,000 char数组(您可以将char视为单个字节)来分配内存。因此,函数将跟踪已使用的内存,并返回可用于使用的大小为'n'的块的指针(如果没有足够的内存,则返回null '0')。
不要担心在此示例中如何释放内存。我重新阅读了您从中提取此示例的部分,它后来定义了一种称为“afree”的方法,以释放此函数分配的内存。
该函数通过每次请求内存时将'allocp'(1000个字符数组的指针)增加'n'(所需的大小)来跟踪已使用的内存。然后,当函数的用户请求更多内存时,它通过以下行检查以确保请求可以满足:
if (allocbuf + ALLOCSIZE – allocp >= n)
…
else{
return 0;
}
如果请求的大小不适合,则返回null。该函数利用“allocp”的当前位置来确定是否还有足够的内存剩余,以供之前的调用使用。
如果请求的大小适合,则会发生以下情况:
allocp += n;
return allocp – n;
这个操作会将“allocp”指针增加所请求内存的大小。该指针用于跟踪此函数请求了多少内存。由于该函数可以满足内存请求,因此现在认为请求的内存正在使用中。因此,该指针现在指向未使用的1000个字符数组中第一个字符。
然后,在增加指针后,该函数通过从“allocp”的当前位置减去“n”(所请求的大小)来返回所请求内存块的第一个字符的指针。
在所有这些过程中,没有人知道这个内存的实际值是什么。没有人知道allocbuf[13]或allocbuf[314]包含什么。该函数只管理哪些内存是空闲的,哪些是已占用的,而不关心内存中实际存储的内容。
如果用户这样请求4个字节:
char* 4bytes = alloc(4)
将32位整数存储在其中,如下所示:
//don’t ever actually do this!!!
int* 4bytesInt = (int*)4bytes;
*4bytesInt = 2,147,483,647;
如果你释放了内存,那么allocbuf的前四个元素将包含该整数。
afree(4bytes);
那么指针仍然有效,allocbuf的前4个元素仍然包含该整数。实际上,并没有改变这些字节的值。
但是,如果您再次请求内存
char* 4bytesAgain = alloc(4);
然后,alloc函数将向‘4bytesAgain’返回它向‘4bytes’返回的相同的4个字节!由于内存已被释放,'alloc'函数可以自由地重用它。所以如果你现在用一个名字填充这四个字节;
4bytesAgain[0] = ‘C’;
4bytesAgain[1] = ‘A’;
4bytesAgain[2] = ‘R’;
4bytesAgain[3] = ‘L’;
如果这样做,将会更改原始“4bytes”和“4bytesInt”所指向的值。