程序改错题

一、下面程序有什么错误:

swap(int *p1,int *p2)
{
	int *p;
	*p=*p1;
	*p1=*p2;
	*p2=*p;
}
//这里p是一个野指针,应改为:
void swap(int *p1,int *p2)
{
	int p;
	p=*p1;
	*p1=*p2;
	*p2=p;
}//可以实现函数外部*p1 *p2的交换
void swap(int *p1,int *p2)
{
	int *p;
	p=p1;
	p1=p2;
	p2=p;
}//只能在函数内部实现交换,不能在函数外部实现 *p1  *p2的交换
 

二、以下代码有什么错误:

#include<iostream>
using namespace std;
int main()
{
	char *S="huahua";
	cout<<S<<endl;
	S[0]='B';
	cout<<S<<endl;
	return 0;
}


程序编译时不出错,运行时会出现内存不能读的错误。
因为"huahua”是字符串常量,S是指针。指向字符串常量,正确的声明方式为 : const  char  *S="huahua";因为是常量,对S【0】的赋值操作是不合法的。

 

三、找出下面的错误

#include<iostream>
using namespace std;
int main()
{
	char *S=(char*)malloc(sizeof(char)*10);
	S="hua";
	cout<<S<<endl;
	return 0;
}
	    


程序执行之后,最后需要释放内存。free();

 

四、下面程序有什么错误:

int a[60][250][1000],i,j,k;
	for (k=0;k<=1000;k++)
	{
		for (j=0;j<=250;j++)
		{
			for (i=0;i<=60;i++)
			{
				a[j][k]=0;
			}
		}
	}


答:需要把循环语句内外对换一下。

 

五、指出错误:

	int **p;
	int arr[100];
	p=&arr;


 

指针类型不同,应该为:

	int **p;
	int *q;
	int arr[100];
	q=arr;
	p=&q;


六、改正错误:

#include<iostream>
using namespace std;
#define MAX 255
int main()
{
	unsigned char A[MAX],i;
	for (i=0;i<=MAX;i++)//i范围:0---255,当i=255时,i++变为0,因此,for为死循环
	{
		A[i]=i;//A[255]=255会越界。A【】范围是从A【0】----A【254】
	}
	return 0;
}


 

七、下面程序:

char a;
	char *str=&a;
	strcpy(str,"huaddddddddddddd");//没有为str分配内存空间,将会发生异常
	//将一个字符串复制进一个字符变量所指地址,虽然可以正确输出结果,但是因为越界导致程序崩溃
	cout<<str<<endl;


八、下面程序有什么错误

#include<iostream>
#include<windows.h>
using namespace std;
void GetMemory(char *p)
{
	p=(char*)malloc(100);

}
int main()
{
	char *str=NULL;
	GetMemory(str);
	strcpy(str,"huahua");
	cout<<str<<endl;
	return 0;
}


函数形参是字符串指针,在函数内部修改形参是不能真正改变传入形参的值去执行完的。函数不能返回动态内存。

#include<iostream>
using namespace std;
char* GetMemory(void)
{
	char p[]="huahua";
	return p;

}
int main()
{
	char *str=NULL;
	str=GetMemory();
	cout<<str<<endl;
	return 0;
}


函数GetMemory返回时,p[]的内存已经释放。所以运行得不到想要的结果。

#include<iostream>
using namespace std;
void GetMemory(char **p,int num)
{
	*p=(char*)malloc(num);
}
int main()
{
	char *str=NULL;
	GetMemory(&str,100);
	strcpy(str,"huahua");
	cout<<str<<endl;
	return 0;
}


问题:1:应该在*p=(char*)malloc(num);后面加

	if (*p==NULL)
	{
		cout<<"申请内存失败!"<<endl;
	}


2:没有free();

 

注意:free() 之后要对指针赋值NULL。

str=NULL;否则指针会变成野指针。

 

八、字符串倒序问题

指出下面程序的错误:

#include<iostream>
using namespace std;
int main()
{

	char *src="0123456789";
	char *dest=NULL;
	int len=strlen(src);
	dest=(char*)malloc(sizeof(char)*(len+1));
	char *d=dest;
	char *s=src[len];
	while (len--!=0)
	{
		
		d++=s--;
	}
	cout<<dest<<endl;
	return 0;
}


1、没有free

2、对d要'\0'

3、将字符调换,使用*d++=*s--

4、s=src[len-1], 并且 不能将char 赋值给 char  *

改为:

#include<iostream>
using namespace std;
int main()
{

	char *src="0123456789";
	char *dest=NULL;
	int len=strlen(src);
	dest=(char*)malloc(sizeof(char)*(len+1));
	char *d=dest;
	char *s=src+len-1;
	while (len-->=0)
	{
		
		*d++=*s--;
	}
	*d='\0';
	cout<<dest<<endl;
	return 0;
}


九、数组越界

	char *src="0123456789";
	char dest[10];
	strcpy(dest,src);


字符串src需要11个字节才能放下,因此dest需要11个字节。strcpy会导致数组越界。

 

### 关于For循环程序改错题的解决方案 在处理 `for` 循环相关的程序改错题目时,通常需要关注以下几个方面: #### 1. 初始化问题 确保循环变量被正确定义初始化。如果未正确设置初始值,则可能导致逻辑错误或无限循环。 ```c // 错误示例:缺少初始化 for (; i < n; i++) { printf("%d\n", i); } // 正确写法 int i; for (i = 0; i < n; i++) { printf("%d\n", i); } ``` 此部分需注意的是,在某些情况下可能会忘记声明或者初始化循环变量[^1]。 #### 2. 条件判断中的边界问题 对于数组或其他数据结构的操作,要特别留意索引越界的情况。这通常是由于不恰当的终止条件引起的。 ```python # 错误示例:访问超出列表长度范围 my_list = [1, 2, 3] for i in range(len(my_list)+1): print(my_list[i]) # 正确写法 for i in range(len(my_list)): print(my_list[i]) ``` 这里强调了当迭代次数超过实际元素数量时会发生错误[^3]。 #### 3. 增量表达式的设定失误 增量操作符的选择不当也可能引发一系列连锁反应,比如步长过大跳过了目标项等问题。 ```java // 错误实例:步长大致两倍导致遗漏中间节点 List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); for(int index=0 ;index<list.size();index+=2){ System.out.println(list.get(index)); } // 改进版本 List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); for(int index=0 ;index<list.size();index++){ System.out.println(list.get(index)); } ``` 这里展示了如何调整每次增加的数量来遍历整个集合而不是仅仅一半。 #### 4. 结合具体应用场景下的特殊需求考虑不足 有时候还需要考虑到特定业务场景的要求,例如是否允许重复读取某条记录等复杂情况。 ```sql -- SQL查询语句中嵌套FOR LOOP的例子 DECLARE @Counter INT SET @Counter = 1 WHILE (@Counter <= 10) BEGIN PRINT 'The Counter is:' + CAST(@Counter AS VARCHAR(MAX)) IF EXISTS(SELECT * FROM Employees WHERE EmployeeID=@Counter AND Salary > AVG(Salary)) THEN CONTINUE ELSE BREAK END -- 应该改为如下形式 FOR SELECT TOP N PERCENT ... ORDER BY ... ``` 上述SQL片段显示了一个复杂的例子,其中包含了基于一定条件下提前退出循环的情形[^2]。 通过以上几个方面的仔细审查可以帮助我们更有效地发现修正与`for`循环有关的各种潜在缺陷。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值