C语言经典问题解析:指针与初始化

需积分: 9 5 下载量 81 浏览量 更新于2024-09-09 收藏 120KB PDF 举报
"C语言经典问题摘录" C语言是一门基础且强大的编程语言,它的语法简洁,但包含了许多深入的概念。以下是对标题和描述中提到的一些C语言经典问题的详细解释: 1. 问题:char *p = malloc(10); 编译器提示“非法初始式”。 解答:这个问题涉及到静态变量与动态内存分配的理解。在C语言中,静态变量(包括全局变量和静态局部变量)的内存是在编译时分配的,而动态内存(通过malloc等函数分配)是在程序运行时分配。因此,不能在静态变量的初始化中使用malloc,因为它需要在运行时才知道内存地址。如果要分配内存,应使用局部或自动变量,例如:`char *p; p = malloc(10);` 2. 问题:*p++与*(p++)的区别。 解答:在C语言中,后缀操作符(如++)具有较高的优先级,这意味着在*p++中,p首先被自增,然后返回p自增之前的值。所以,*p++会先返回p当前指向的值,然后p指向下个位置。若要自增p所指向的值,应该使用(*p)++或++*p。 3. 问题:为什么((int*)p)++; 无法实现跳过int型变量? 解答:类型转换操作符不会改变指针本身,只影响其后的表达式。((int*)p)++; 这一行代码尝试将一个char指针转换为int指针,然后自增。但自增操作仅对原始的char指针有影响,而不是转换后的int指针。正确做法是将指针转换后直接加上类型大小,例如:`p = (char*)((int*)p + 1)` 或 `p += sizeof(int)`。 4. 问题:空指针和未初始化的指针有何不同? 空指针是一个特殊值,表示不指向任何有效对象或函数,它是安全的,可用来表示“无值”。而未初始化的指针可能含有任意内存中的值,可能会意外地指向某个位置,这可能导致未定义的行为。 5. 问题:能否用0表示空指针? 解答:在C语言中,0在指针上下文里会被转换为NULL,也就是空指针。在初始化、赋值或比较时,如:`char *p = 0;` 或 `if (p != 0)` 是合法的。但在函数调用中,如:`execl()`,直接传入0可能会被误认为整数0而非空指针。为避免混淆,应使用显式类型转换 `(char*)0`。 以上就是对C语言经典问题的详细解答,这些问题涵盖了指针初始化、动态内存、指针运算以及空指针和未初始化指针的区别等方面,这些都是C语言学习中至关重要的知识点。理解并掌握这些概念对于编写健壮和安全的C程序至关重要。