`
webcode
  • 浏览: 5940234 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

C、C++容易出错的几个地方

 
阅读更多

1. sizeof()和strlen()函数

sizeof常见标准用法:

(1)

char buff[6];

strncpy(buff, argv[1], sizeof(buff));

(2)

int array[] = { 3, 1, 4, 1, 5, 9 };

unsigned int array_size = sizeof(array) / sizeof(array[0]);

(3)

typedef struct data_type {

int age;

char name[20];

} data;

data *bob;

bob = (data*) malloc( sizeof(data) );

if( bob != NULL ) {

bob->age = 22;

strcpy( bob->name, "Robert" );

printf( "%s is %d years old\n", bob->name, bob->age );

}

free( bob );

可见,sizeof主要用于求某种数据(例如int,数组,字符串,指针,结构体…)的size,例如:

char str[]="hello";

char *p1=str;

此时,用sizeof(str)得到的是6,因为hell0是5个字符,系统储存的时候会在hello的末尾加上结束标识\0,一共为6个字符;

而sizeof(p1)得到的却是4,它求得的是指针变量p1的长度,在32位机器上,一个地址都是32位,即4个字节。

用sizeof(*p1)得到的是1,因为*p1定义为char,相当于一个字符,所以只占一个字节。

用strlen(str),得到的会是5,因为strlen求得的长度不包括最后的\0。

用strlen(p1),得到的是5,与strlen(str)等价。

上面的是sizeof和strlen的区别,也是 指针字符串和 数组字符串 的区别。

编程时这种错误非常隐秘,见下面的一个例子。

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int main( )

{

char *src="hello world";

char *dest=NULL;

int len=strlen(src);//这里很容易出错,写成sizeof(src)就是求指针的长度,即4

dest=(char *)malloc(len+1);//这里很容易出错,写成len

char *d=dest;

char *s=&src[len-1]; //这里很容易出错,写成len

while(len--!=0)

*d++=*s--;

*d='\0'; //这句很容易漏写

printf("%s\n", dest);

free(dest); //这句很容易漏写

return 0;

}

注意,我上面这个C语言程序是在Linux平台下gcc编译的,Windows平台下的VC6不支持即用即声明的形式,必须先定义后使用。用VC6编译可以改成下面的形式:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int main( )

{

char *src, *dest, *d, *s;

int len;

src="hello world";

dest=NULL;

len=strlen(src);

dest=(char *)malloc(len+1);

d=dest;

s=&src[len-1];

while(len--!=0)

*d++=*s--;

*d='\0';

printf("%s\n", dest);

free(dest);

return 0;

}

首先说明一下malloc函数和free函数的使用

#include <stdlib.h>

void *malloc( unsigned int size );

它的功能是在内存的动态存储区分配一个长度为size字节的连续空间。函数返回的是一个指向分配域其实地址的指针,这个指针的类型是void类型。如果函数未能执行成功则返回一个空指针NULL,使用这个函数必须包含头文件stdio.h。

void类型的指针,指向一个类型未定的变量,也就是说它可以指向char类型变量,也可以指向int类型或其它类型。因此在将它的值赋值给另外一个指针时要进行强制类型转换,例如:

char *p1="123456";

void *p2="abcdef";

p1=(char *)p2;//两者类型必须相同,也可以p2=(void *)p1;

malloc函数必须和free函数成对出现,使用完了free(dest);

2. 数组中易错的地方

分析下面这段小程序:


以及下面这个程序:


执行结果为:
abc
7�

&array与array的语义相同。在这里指针与数组是不能互换的。&pointer为指针的地址,与show_str_pointer参数char **ppstr指向指针的指针的变量类型相同。而&array仍然为数组地址,与参数char **ppstr的类型不符。

稍后将做详细讲解。

分享到:
评论

相关推荐

    新手学习C++入门资料

    C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++可以使用空参数列表。 C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。 标准C++中的字符串类取代了C...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    10.2.4 指针变量几个问题的进一步说明 140 810.3 数组指针和指向数组的指针变量 141 10.3.1 指向数组元素的指针 142 10.3.2 通过指针引用数组元素 143 10.3.3 数组名作函数参数 146 10.3.4 指向多维数组的指针和指针...

    程序员在运用C++语言写代码的时候需要注意的五个方面.docx

    当编写C ++代码时,有几个方面应该特别注意,以确保代码的质量和可维护性。下面是程序员在使用C ++编写代码时应该注意的五个方面: 1.内存泄漏问题 - 内存泄漏可能会导致程序崩溃或性能下降。在编写C ++代码时,需要...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    10.2.4 指针变量几个问题的进一步说明 140 810.3 数组指针和指向数组的指针变量 141 10.3.1 指向数组元素的指针 142 10.3.2 通过指针引用数组元素 143 10.3.3 数组名作函数参数 146 10.3.4 指向多维数组的指针和指针...

    《Visual C++ .NET实用编程百例》

    ·对于第七章中的大部分实例,必须首先安装IIS5.0或以上版本,并将项目文件夹拷贝到"C:\Inetpub\wwwroot"目录下(如果操作系统装载其他盘,则将C改为相应的驱动器号)。 ·第五章中的第47例至第49例是一个项目文件 ...

    Effective Exception Handling in Visual C++

    如果你的程序有好几个线程,那么事情或许会更复杂一些。有些异常处理机制是对整个程序有效的,而另一些则仅对当前线程有效,这种情况下,你必须为每个线程都安装异常处理。 你程序中的每个模块(EXE或DLL)如果都...

    c++ primer 第5版(李普曼) part3

    此修订版是C++进化过程中的最新一步,延续了前几个版本对编程效率的强调。新标准的主要目标是:  使语言更为统一,更易于教学  使标准库更简单、安全、使用更高效  使编写高效率的抽象和库变得更简单  因此...

    C语言标准教程第一章 C语言概论

    这几个程 序由简到难,表现了C语言源程序在组成结构上的特点。虽然有关内容还未介绍,但可从这些例子中了解到组成一个C源程序的基本部分和书写格式。 main() { printf("c语言世界www.vcok.com,您好!\n"); }  ...

    c++基础教程,简洁扼要

    其中 class_name 是类的名称 (用户自定义的类型) ,而可选项object_name 是一个或几个对象(object)标识。Class的声明体中包含 成员members,成员可以是数据或函数定义,同时也可以包括允许范围标志 permission ...

    C程序设计 第四版 谭浩强 高清扫描版 带完整书签目录 加 学习辅导

    本书的每个例题都按以下几个步骤展开:提出任务—解题思路—编写程序—运行程序—程序分析—有关说明。符合读者认知规律,容易入门与提高。 本书内容先进,体系合理,概念清晰,讲解详尽,降低台阶,分散难点,例题...

    c++ 面试题 总结

    块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的...

    (谭浩强)c语言学习书

    这几个程序由简到难,表现了C语言源程序在组成结构上的特点。虽然有关内容还未介绍,但可从这些例子中了解到组成一个C源程序的基本部分和书写格式。 【例1.1】 main() { printf("世界,您好!\n"); }  main是...

    你必须知道的495个C语言问题

    2.25 有什么显示枚举值符号的容易方法吗? 位域 2.26 一些结构声明中的这些冒号和数字是什么意思? 2.27 为什么人们那么喜欢用显式的掩码和位操作而不直接声明位域? 第3章 表达式 求值顺序 3.1 为什么...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 -----------------------------------------------------------------------...

    谭浩强c语言程序设计

    10.2.4 指针变量几个问题的进一步说明 140 8 10.3 数组指针和指向数组的指针变量 141 10.3.1 指向数组元素的指针 142 10.3.2 通过指针引用数组元素 143 10.3.3 数组名作函数参数 146 10.3.4 指向多维数组的指针和...

Global site tag (gtag.js) - Google Analytics