C语言笔试精华:内存管理与参数传递解析

0 下载量 89 浏览量 更新于2024-09-02 收藏 59KB PDF 举报
本文档是对C语言笔试中常见经典问题的总结,旨在帮助考生理解和应对面试中的挑战。主要内容涵盖了以下几个关键知识点: 1. **指针内存理解**:在`void *p = malloc(100);`中,虽然sizeof(p)的结果为4,但这是指针本身的大小,而非它指向的内存容量,即100个字符。这强调了在处理指针时注意区分变量本身和它所指向的数据。 2. **数组作为函数参数**:当数组作为函数参数如`void Func(char str[100])`时,数组会自动转换为指向数组首元素的指针,此时sizeof(str)得到的是指针的大小,而不是数组的实际长度。 3. **字符数组大小**:声明`char str[100];`时,sizeof(str)返回的是100,表示数组本身占用的内存空间,而非数组中存储内容的大小。如果str是一个字符数组,实际内容为"hello",则sizeof(str)会根据实际内容计算,而`char *p = str;`和`int n = 10;`说明sizeof(n)可能因操作系统位宽不同而不同,32位系统中可能是4。 4. **宏的使用与展开**:宏定义如`#define A 3`和`#define C A+B`表明宏展开是简单的文本替换,但在计算`#define s(x) x*x`时,要注意宏的实际作用,如`s(c)`会替换为`(3+4*3+4)`,结果为19。宏的副作用可能会影响程序的行为。 5. **函数参数传递与内存管理**:在`GetMemory`函数中,由于指针`p`作为输出参数,实际上创建了一个临时副本 `_p`。函数内部对`_p`的修改不会影响到函数外部的`p`,除非显式地更新。`strcpy`调用失败是因为`str`在函数外部依然为NULL,这展示了C语言中的值传递方式,以及避免内存泄漏的重要性。 6. **值传递和形参实参关系**:函数`GetMemory`中的问题揭示了C语言中值传递的特点,形参`p`的修改只影响副本 `_p`,而非实参`str`。此外,每次调用`GetMemory`都会分配内存但未释放,导致内存泄漏。 通过以上内容,本文为准备C语言笔试的人提供了对基础概念和常见问题的深入理解,有助于提高面试准备效率和通过率。阅读和理解这些知识点将有助于在职场中进行有效的技术沟通和项目开发。