==【注意】== 程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度
【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; }