Igi*_*gid 2 c pointers kernighan-and-ritchie
我正在通过阅读K&R(ANSI 版)学习 C ,并辅以21st Century C。我想说我已经对指针的大部分基础知识非常有信心了。这意味着我知道您必须非常小心地将指针传递出函数,而该函数既没有首先传递给函数,也没有被malloc编辑。所以这个例子让我难住了。它来自 \xc2\xa75.6,第 109 页:
#define MAXLEN 1000 /* max length of any input line */\nint getline(char *, int);\nchar *alloc(int);\n\n/* readlines: readinputlines */\nint readlines(char *lineptr[], int maxlines)\n{\n int len, nlines;\n char *p, line[MAXLEN];\n\n nlines = 0;\n while ((len = getline(line, MAXLEN)) > 0)\n if (nlines >= maxlines || (p = alloc(len)) == NULL)\n return -1;\n else {\n line[len-1]=\'\\0\'; /* delete newline */\n strcpy(p, line);\n lineptr[nlines++] = p;\n }\n return nlines;\n}\nRun Code Online (Sandbox Code Playgroud)\n\nstrcpy()之前定义为:
/* strcpy: copy t to s; pointer version 3 */\nvoid strcpy(char *s, char *t)\n{\n while (*s++ = *t++)\n ;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我不明白p函数返回后,所指向的内存如何保留在范围内。这就是我所理解的。指针p是在函数内声明的 - 因此它位于自动内存中。至于它指向什么,它没有显式分配任何内存。然后,当strcpy调用时,值会从line指向p的位置复制。
我还在21 世纪 C中讨论了指针的危险,并举例说明尝试将自动内存中声明的数组传递出函数绝对是不行的。(第 109 页:“指向已自动释放的内存块的指针比无用更糟糕。”)因此,我可以理解上述代码有效的唯一方法是,将 not 声明为p数组,其中内存块在自动内存中显式分配,但作为指针,其内存分配以某种其他方式隐式处理。那是对的吗?内存分配是如何工作的?
注意:通过阅读21st Century C,我试图消除K&R 的任何不良做法可能给我带来的任何不良做法。我知道这不是最好的标准,而且我可能永远不会以本示例中演示的方式编写代码。但我还是想了解一下。
\n事实上,指针p本身驻留在自动存储器中。然而,在评估以下 if 语句的条件期间,它被分配了一个内存块:
if (nlines >= maxlines || (p = alloc(len)) == NULL)
Run Code Online (Sandbox Code Playgroud)
更具体地说,如果条件的第一项为假(因为 or 逻辑运算符是短路运算符),则评估第二项,执行内存分配并检查是否成功。
根据我对 K&R 的旧了解,该alloc函数是 的简化版本malloc,在您看到此示例之前在某处定义。然而,内存分配函数(例如malloc这里举例的标准函数)的目的alloc是允许您在堆上保留内存。堆是在程序执行期间定义的内存区域,它不会自动管理,即编译器不会对其执行任何操作,除非您明确告诉它这样做。因此,您可以按值返回/传递指针p。变量本身的内存没有多大用处;它的价值才是最重要的。它指向一个已分配的内存区域,只要您愿意,该内存区域就会保留在那里(直到您显式释放它)。只要确保在释放该区域之前不会丢失该区域的内存地址即可。
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |