首页 > 试题广场 >

看看下面的一段程序有什么错误?

[问答题]
看看下面的一段程序有什么错误?
swap( int* p1,int* p2 ) 
{ 
 int *p; 
 *p = *p1; 
 *p1 = *p2; 
 *p2 = *p; 
} 
初始化int*p = NULL也不对,p还是一个野指针,没有自己指向的内存,如果非要用int*p的话,
可以给p分配一个内存,不过记得释放掉

#include <stdio.h>
#include <stdlib.h>

using namespace std;

void swap(int* p1, int* p2){
    int* p = NULL;
    p = (int*)malloc(4);
    *p = *p1;
    *p1 = *p2;
    *p2 = *p;
    free(p);
}

int main(){

    int a = 2,b = 3;
    swap(&a, &b);
    printf("%d,%d\n", a, b);
    system("Pause");
    return 0;
}


发表于 2018-02-26 21:23:31 回复(7)
更多回答
推荐
1.需要一个返回值void 
2在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access Violation”。该程序应该改为:
void swap( int* p1,int* p2 ) 
{ 
 int p; 
 p = *p1; 
 *p1 = *p2; 
 *p2 = p; 
} 
编辑于 2016-11-03 08:15:21 回复(11)
int *p;
不对p进行初始化,或者*p = NULL,
这时p的指向都是不定的,是个野指针,
不能使用*p = *p1
发表于 2017-07-19 10:45:04 回复(0)
指针的值(即地址)应属下列4种状态之一:
1.指向对象
2.指向紧邻对象所占空间的下一个位置
3.空指针
4.无效指针,即除1,2,3外的情况

当 int *p 或者 int *p = NULL时,
*p = *p1;
需要访问p所指的对象,这是不被允许的“Access Violation”

参见C++ Primer 第五版,2.3.2指针

发表于 2018-03-19 22:15:52 回复(1)
void swap(int *p1, int *p2)
{
int a = 0;
int *p = &a;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
指针一定要初始化
发表于 2017-08-28 11:02:22 回复(4)
答案是错的。按照答案并不能实现交换。应该为:
void swap(int* p1, int* p2)
{
int p=0;
p = *p1;
*p1 = *p2;
*p2 = p;
}
(vs13测试通过)
发表于 2016-09-21 11:46:52 回复(2)

void swap(int *p1,int *p2)
{
int p=0;
p=*p1;
*p1=*p2;
*p2=p;
}
void swap(int &p1,int &p2)
{
int p=0;
p=p1;
p1=p2;
p2=p;
}
void swap(int *p1,int *p2)
{
int *p=NULL;
memcpy(p,p1,4);
memcpy(p1,p2,4);
memcpy(p2,p,4);
}
编辑于 2017-07-03 02:12:10 回复(0)
主要是 指针int *p 
p没有具体的指向位置,指针没有初始化,野指针是没法使用的。
正确的使用方法
int *p = NULL;
发表于 2016-04-21 10:33:16 回复(6)
int *p;会默认p=NULL,而该地址不允许访问,所以无法通过*p=*p1这种语句进行NULL地址的访问。
发表于 2019-05-02 13:08:15 回复(0)
在swap里面计算按照题友说的,加上int *p=NULL,使p不是野指针,结果仍然错误的。*p=*p1的时候,会出现编译错误,因为可能访问到其他有效的内存了。
发表于 2017-05-15 16:25:54 回复(2)
形参传入的时候应该改成引用调用吧。
void swap( int* &p1,int* &p2 )
{
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}
发表于 2017-04-03 11:03:12 回复(0)
p是野指针,初始化为NULL在本题也是错的,另外,即使不指向系统区,指向其他地方,也有可能碰巧指向的是一块有用的内存,然后无意间就修改了其中的值,造成严重的错误。
发表于 2017-03-18 01:37:16 回复(1)
*p = *p1, *p是一个常量吧,怎么可以做左值。至于int *p未初始化这个问题在此处应该不算大错误,至少指针是允许不初始化的。
发表于 2017-02-22 17:17:45 回复(0)
声明指针时必须初始化,避免野指针 int* p = NULL;
发表于 2016-04-10 19:52:45 回复(1)
(1)函数缺少返回值void (2) int *p是一个野指针,不知道指向哪块内存空间,应修改成int p。
发表于 2021-03-25 22:43:02 回复(0)
加返回值 void p是一个野指针
发表于 2021-03-10 19:58:40 回复(0)
<p>不要直接定义一个没有指向的指针,会是野指针</p>
发表于 2020-10-30 11:30:43 回复(0)
1.无返回值 2.野指针
发表于 2020-08-31 21:37:05 回复(0)
<p>需要返回值</p><p>p是一个野指针应该 定义时应该指向NULL</p>
发表于 2020-08-06 21:58:12 回复(0)
<p>野指针</p>
发表于 2020-07-22 12:55:51 回复(0)
<p>1、 局部指针变量p未初始化且未分配内存空间,可以改为int p=0,这样也省了malloc时耗费的时间;</p><p>2、未对行参p1 p2进行有效性判断;</p>
发表于 2020-06-21 17:56:54 回复(0)