错误存档

1.当n是short int ,m是long long int时,语句m=4*n,使用GNU,得到的m是short int的范围,因此当n稍大时,m就可能溢出。


2.输出字符串时,遇到‘\0’结束输入,如果没有适当地设置'\0',可能会出现问题。比如有

struct node
{
    char s[10];
}n[2];

如果w[0].s中没有‘\0’,则scanf("%s",n[0].s)不会只输出n[0]中字符数组s中的内容,因为这一个输出语句是输出以n[0].s为首地址直到'\0'为止的内容。


3.当用memset给char型以外的数组初始化时,只能初始化为0或-1。计算机中数字以补码形式存储,只有两种数值:0和1,0和-1的补码分别是0和1.


4.i*=2+1;的含义是i=i*(2+1)而不是i=i*2+1.


5.创建类的指针时不伴随内存分配,比如有类ClassA,创建指针:ClassA *p;则*p没有分配到一片大小为sizeof(ClassA)的内存空间。


6.有程序:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    s[0]='1';
    s+="234";
    cout<<s<<endl;
    return 0;
}

输出“1234”?NO!输出“234”。


7.string  str; str="1"+"12";s="1";s+="234"; 可以;s="",s+="1",s+="234"也可以。


8.getchar()能接收回车和空格


9.scanf("%d%c", &n, &c);输入1然后回车,输出空行,表示c接收了空行;但是以下语句:

scanf("%d %c", &n, &c);//只是%d和%c之间多了个空格,c就不会接收空格了!、


10.如果输出字符串时莫名地多了一个空格,可能使'\0'作祟,因为执行cout << '\0';正正输出一个空格。执行以下命令cout << '\0' << 1 <<endl << " " << 1;就可以很清楚地看出输出'\0'和输出" "的效果一样。


11.if(...)

       if(...)

       {

         ....

      }

    else(...){}

else应该是和第一个if对应的,但是我在使用GNU编译器时运行结果却是和第二个if对应,导致出错。注意!!!改为

if(...)

{

       if(...)

       {

         ....

      }

}

else{...}

 

12.有程序:

#include <iostream>
using namespace std;

struct A
{
	int a;
	A *link;
};

int main()
{
	struct A *n;
	//struct A m;
	//n = &m;
	cin >> n->a;
	cout << n->a;
	return 0;
}


运行程序,输入1,内存就出错。这是因为,n只是一个struct A型的指针,只能储存结构体变量的地址,加上注释的部分代码就能正常运行。又或者给n动态分配内存:

#include <iostream>
using namespace std;

struct A
{
	int a;
	A *link;
};

int main()
{
	struct A *n;
	n = new struct A; //添加的部分
	cin >> n->a;
	cout << n->a;
	return 0;
}


 13.

#include <iostream>
using namespace std;

struct A
{
	int a;
	A *link;
	A(){link = NULL;}
};

int main()
{

	struct A *t;
	//t = new struct A;
	delete t;
	return 0;
}


 

运行以上程序会出错,原因是t尚未分配到内存不能delete。加上注释掉的那部分程序就ok

 


 

猜你喜欢

转载自blog.csdn.net/cs_zlg/article/details/7758617