==【注意】==
程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度
本帖属不定时连载贴,以试卷的形式提出一个比较基础的问题供大家思考讨论,问题的解析将在下一更新贴中一并给出,这样做是希望还不清楚问题的朋友有自己思考和讨论的时间,希望大家能从这些帖子中有所收获。
贴中问题属我在学习C\C++过程中遇到的一些语法或者比较隐晦的程序问题,其中有自己的总结,也不乏网络上搜索到的经典解析,在此分享给大家,希望能起到抛砖引玉的作用
我已认真检查过自己的帖子,但难免有疏忽,如大家在阅读过程中仍发现有问题,请,我会及时更正,以免误导大家,万分感谢^_^


【No.9 内存泄漏了么?】
由于连载形式,每帖第二部分都配有上一问题的解答。为了保持帖子的针对性和一致性,
[问题9]
请找出下面C代码的错误并想办法改正:
复制内容到剪贴板
代码:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
void AllocateMem(char *ptr, int size)
{
  ptr = (char *)malloc(sizeof(char *) * size);
}
void main(void)
{
  char *p = NULL;
  AllocateMem(p,5);
  strcpy(p,"1234");
  printf("%s\n",p);
}



问题浅析
复制内容到剪贴板
代码:
#include<iostream>
int main(int argc, char **argv)
{
  const char *str1 = "abc";  //无错误,声明str1为指向常量
                                         //的字符类型指针,并将其初始
                                         //化指向字符串"abc"
                                         //即str1是一个指向const char的普通指针
                                         //可以修改str1的指向,但是不能试图
                                         //通过对str1解引用去修改它所指向的内容
  
  char * const str2 = "abc";  //无错误,声明str2为指向普通
                                          //字符的常量指针,并将其初始
                                          //化指向字符串"abc"
                                          //即str2是一个指向普通char的常量指针
                                          //可以通过对str2解引用修改其指向的内
                                          //容,但是不能修改str2的指向
  //根据以上两条定义,下面对以下赋值语句进行浅析
  str1[1] = 'B';  //错误:str1指向的是常量,因此其指向的内容不能被修改
  *str1[1] = 'B';  //语法错误,[ ]优先级高于*,因此先得到str1[1]这
                        //字符'b',然后试图对常量字符'b'进行解引用,出错
  *str1 = "ABC";  //错误:str1指向的是常量,因此不能试图通过对str1解引用
                          //修改其指向的值
  str1 = "ABC";  //正确:str1是一个指向常量的普通指针,因此可以修改str1
                        //的指向,本句执行后,str1指向新的字符串"ABC"
  str2[1] = 'B';  //正确:str2是一个指向普通char类型的常量指针,可以通过
                      //对str2解引用修改其指向的值,这句执行后str2指向的字符串
                      //为"aBc"
  *str2[1] = 'B';  //语法错误,[ ]优先级高于*,因此先得到str1[1]这
                        //字符'b',然后试图对常量字符'b'进行解引用,出错
  *str2 = "ABC";  //错误:虽然可以通过对str2解引用修改其指向的值
                          //但是 *str2 得到的是一个字符变量,不能将字符串"ABC"
                          //赋值给一个字符变量
  str2 = "ABC";  //错误:str2是一个常量指针,不能修改它的指向
  return EXIT_SUCCESS;
}