C语言返回一个数组时,输入数组初始化方式对程序正确性的影响

心态与习惯
博客专家认证
2016-12-09 10:18:57
我试了下编写一个返回数组的函数,用到了指针。然而,输入数组初始化方式不同,竟然影响了程序的正确性。

#include "stdio.h"
#include "stdlib.h"

int * setValue(int *arr,int n)
{
int *a=(int *)malloc(2*sizeof(int));
int maxNum=0,maxIndex,i;
for (i=0;i<n;i++)
if (arr[i]>maxNum)
{maxNum=arr[i];maxIndex=i+1;}
a[0]=maxNum;a[1]=maxIndex;
return a;
}

void main()
{
int a[2]={5,2};//a[0]=5,a[1]=2;
int *b=setValue(a,2);
int i;
for(i=0;i<2;i++)
printf("b[%d]=%d\n",i,b[i]);

free(b);
}


这个是正确的,然而当将数组各个元素分别初始化时,程序却出错了:
#include "stdio.h"
#include "stdlib.h"

int * setValue(int *arr,int n)
{
int *a=(int *)malloc(2*sizeof(int));
int maxNum=0,maxIndex,i;
for (i=0;i<n;i++)
if (arr[i]>maxNum)
{maxNum=arr[i];maxIndex=i+1;}
a[0]=maxNum;a[1]=maxIndex;
return a;
}

void main()
{
int a[2];a[0]=5,a[1]=2;
int *b=setValue(a,2);
int i;
for(i=0;i<2;i++)
printf("b[%d]=%d\n",i,b[i]);

free(b);
}


一直找不到原因,感觉似乎是指针位置移动了,没有指向数组首地址。还请大神解答下。
...全文
118 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灸舞 版主 2016-12-09
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
paschen 2016-12-09
  • 打赏
  • 举报
回复
两个程序最后输出的不都是5 1 吗
paschen 2016-12-09
  • 打赏
  • 举报
回复
for (i=0;i<n;i++) if (arr[i]>maxNum) {maxNum=arr[i];maxIndex=i+1;} 第一次循环 5 > 0满足,maxNum变为5;maxIndex变为1 第二次循环 2 > 5 不满足 所以之后两个元素是5 1
心态与习惯 2016-12-09
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
两个程序最后输出的不都是5 1 吗
我摸索出来了。c语言变量必须在使用函数前声明。因此,c语言不支持 int *b=setValue(a,2); 必须分开。 改为 int *b; b=setValue(a,2); 才能编译成功。再次感谢版主的回答。
心态与习惯 2016-12-09
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
两个程序最后输出的不都是5 1 吗
谢谢版主的热心回答,我的vs运行后者出错,不知道怎么回事;我用一个在线 c编译器却运行成功。或者把后缀改为 cpp 就能编译成功。貌似程序里出现了只有c++采用的语法。

69,371

社区成员

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

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