- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!