gpt4 book ai didi

c - 函数返回一个指针

转载 作者:行者123 更新时间:2023-12-04 12:07:33 25 4
gpt4 key购买 nike

我是 C 的新手,我很难掌握所有这些指针。换句话说,取消引用运算符和&符号运算符。我相信,在盯着它们看了一会儿之后,我开始理解它们是如何工作的。例如:

    int x = 1;            //this creates an integer variable called x and assigns one to it
int *pointer; //this creates a pointer variable that will point to an integer
pointer = &x; //now the variable pointer points to x
*pointer = 0 //the value that pointer points to is now zero

我很确定我理解它是如何工作的。
我正在阅读 Kernighan 和 Ritchie 的“The C Programming Language”,但我对他们在第 5.4 节(地址算术)中的一些代码感到困惑。我应该指出,我了解地址算术,所以我的问题与此无关。我对下面函数中的代码的问题也不是。在线搜索有关此代码的问题会生成很多帖子,其中人们不理解 if/else 语句中的代码是如何运行的。无论如何,我的问题专门针对函数名称本身。

    #define ALLOCSIZE 1000
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;

char *alloc(int n) /*return pointer to n charachters*/
{
if (allocbuf + ALLOCSIZE - allocp >=n)
{
allocp += n;
return allocp - n;
}
else
return 0;
}

同样,我理解函数中的代码,但是如何理解

*alloc

工作?我知道这个函数返回一个指针。这是否意味着通过将函数名称作为指针,我们将返回一个指向 char 类型的指针?如果是这样,它指向什么?在我之前的例子中,我们有

    int x = 1;
int *pointer;
pointer = &x;

这里变量“pointer”指向变量x。然而。在函数 alloc 中没有指向任何东西。任何帮助将不胜感激。

最佳答案

这个函数

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 的字符数组。我们有一个包含 1,000 个字符的数组,名称“allocbuf”指向数组中的第一个元素。接下来,在这一行;

static char *allocp = allocbuf;

我们创建一个指向 1,000 字符数组 (allocbuf) 的第一个元素的指针 (allocp)。数组和指针都是全局变量。可以在程序的任何位置访问它们。在您发布的示例中,这些变量将在 alloc 函数中使用。

在我们继续之前,定义函数的目的是有意义的。目的是使用之前定义的 1000 个 char 数组(这可能有助于您将 char 视为单个字节)来分配内存。因此该函数将跟踪已使用的内存。并返回一个指向可以使用的大小为“n”的 block 的指针(如果没有足够的内存,则为空“0”)。

不要关心这个例子中内存是如何释放的。我重读了你从中提取这个例子的部分,它后来定义了一个名为“afree”的方法来释放这个函数分配的内存。

该函数通过每次请求内存时将“allocp”(指向 1000 个字符的数组的指针)递增“n”(请求的大小)来跟踪已使用的内存。然后,当函数的用户请求更多内存时,它会检查以确保这些行可以满足请求;

if (allocbuf + ALLOCSIZE – allocp >= n)

else{
return 0;
}

如果请求的大小不适合,则返回 null。该函数利用“allocp”的当前位置来确定是否有足够的内存来自之前的调用。如果请求的大小确实适合,则会发生这种情况;

allocp += n;
return allocp – n;

无论请求了多少内存,它所做的就是增加“allocp”。该指针用于跟踪已为此函数请求了多少内存。由于该函数可以满足内存请求,因此它现在认为请求的内存正在使用中。因此,指针现在指向 1000 字符数组中未使用的第一个字符。然后,在递增指针后,该函数返回指向内存块的第一个字符的指针,方法是从“allocp”的当前位置减去“n”(请求的大小)。

纵观所有这些,没有人知道这段内存的实际值(value)是什么。没有人知道 allocbuf[13] 或 allocbuf[314] 包含什么。该函数只管理哪些内存是空闲的,哪些是被占用的,它并不关心内存中实际存储的是什么。

如果用户像这样要求 4 个字节

char* 4bytes = alloc(4)

像这样在其中存储一个 32 位 int;

//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 将返回相同的 4 个字节到“4bytesAgain”,它返回到“4bytes”!由于内存已释放,“alloc”函数可以随意重用它。因此,如果您现在用名称填充这四个字节;

4bytesAgain[0] = ‘C’;
4bytesAgain[1] = ‘A’;
4bytesAgain[2] = ‘R’;
4bytesAgain[3] = ‘L’;

然后这将改变原始‘4bytes’和‘4bytesInt’指向的值。

关于c - 函数返回一个指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46749200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com