函数形参为指针的问题!

leonliu7558168 2010-05-31 11:25:10
int a[10]={1,1,2,2,2,3,4,5,6,7};

int *del(int *n,int l,int *j)//该函数的功能为删除有序数组内的重复元素,我申请了一个地址指针存在r,函数返回值为r
//想利用j返回无重复数组的个数但是运行除了问题请帮忙看看
{
int i;
int *r;
r=(int *)malloc(sizeof(int)*l);
for(i=0,j=0;i<l;i++)//
if(n[i]!=n[i+1]) r[(*j)++]=n[i];//进行两两比较,当遇到不同的数放入r空间里
return r;
}


void main()
{
int *r,len=0,i;
r=del(a,10,&len);
for(i=0;i<len;i++)
printf("%d",r[i]);
}
...全文
130 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixing01 2010-06-01
  • 打赏
  • 举报
回复
还有一点真的很重要,你对数组的判断逻辑是有问题的:
1.越界问题前面有人说了
2.但前面人修改的公式,无法处理只有1个元素的情况(没有进入循环),也无法处理最后一个数需要记录的情况(被忽略掉了)

临界问题尤其要仔细考虑
lixing01 2010-06-01
  • 打赏
  • 举报
回复
int * ClearArray(const int * SourceArray, const int size, int & ResultArrSize)
{
int * ReslutArray = (int *)malloc(sizeof(int) * size);
*ReslutArray = *SourceArray;
ResultArrSize = 1;
for(int index = 1; index < size; index++) {
if (*(SourceArray + index) > *(SourceArray + index - 1)) { //有序数组判断是否出现不同值
*(ReslutArray + ResultArrSize) = *(SourceArray + index);
ResultArrSize++;
}
}
return ReslutArray;
}


void main()
{
int a[10] = {1,1,2,2,2,3,4,5,6,7};

int ResultArrSize;
int * ReslutArray = del(a, 10, ResultArrSize);

for(int i = 0; i < ResultArrSize; i++) {
printf("%d", ReslutArray[i]);
}

free(ReslutArray); //!
return;
}


按你的思路:内存在函数内分配并返回,则只能在main中释放,但你分配的方式并不是根据实际结果分配最小的内存,何必这样呢?何况分配和释放并不是在同一个代码段内对应,不好.
不如在外部定义一个同样大小的数组,直接传进函数更新
leonliu7558168 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lixing01 的回复:]
还有一点真的很重要,你对数组的判断逻辑是有问题的:
1.越界问题前面有人说了
2.但前面人修改的公式,无法处理只有1个元素的情况(没有进入循环),也无法处理最后一个数需要记录的情况(被忽略掉了)

临界问题尤其要仔细考虑
[/Quote]
你说得很对!
leonliu7558168 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]
if(n[i]!=n[i+1]) r[(*j)++]=n[i];//你应该是和r这个数组里面的元素比较
[/Quote]
恩,你说的这种方法比我的好!你这种方法就不需考虑边缘的问题了!只需初始化第一个!
我改了对了!
llrock 2010-06-01
  • 打赏
  • 举报
回复
首先,你的内存释放是个问题
其次,这种情况使用链表操作会更容易,效率会更高
vanchristin 2010-06-01
  • 打赏
  • 举报
回复
临界问题,临界问题啊
东莞某某某 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 artifly2000 的回复:]
for(i=0,j=0;i<l;i++)//
if(n[i]!=n[i+1]) r[(*j)++]=n[i];//进行两两比较,当遇到不同的数放入r空间里

上边的n[i+1]访问越界了,
需要将for循环中的i<l,改成i < l-1
[/Quote]
queshi确实越界了
ArtiFly2000 2010-05-31
  • 打赏
  • 举报
回复
for(i=0,j=0;i<l;i++)//
if(n[i]!=n[i+1]) r[(*j)++]=n[i];//进行两两比较,当遇到不同的数放入r空间里

上边的n[i+1]访问越界了,
需要将for循环中的i<l,改成i < l-1
pengzhixi 2010-05-31
  • 打赏
  • 举报
回复
if(n[i]!=n[i+1]) r[(*j)++]=n[i];//你应该是和r这个数组里面的元素比较
yxriyin 2010-05-31
  • 打赏
  • 举报
回复
在函数内部定义的变量都是局部变量,
一旦函数调用结束该变量就会被释放,所以你在函数内部申请空间是不行的,
要么你定义一个静态的,或者全局的,或者在函数外部申请空间

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧