为什么稳定出现一个固定的值?

int a[3],*p = a,i,j,temp;
for(i=1;i<=2;i++,p++)
scanf("%d",p);

int max(int b,int c);
int min(int d,int f);

for(i=1;i<=10;i++)
for(j=0;j<=1;j++)
{
    temp = max(a[j],a[j+1]);
    a[j] = min(a[j],a[j+1]);
    a[j+1] = temp;
}

for(p=a;p<=(a+2);p++)
printf("%-3d",*p);

return 0;

int max(int b,int c)
return(b>c?b:c);

int min(int d,int f)
return(d<f?d:f);
这个程序不管输入什么永远会有一个42怎么回事

img


第二行,你只输入了两个值,而数组长度为3,所以这个42是内存当中不知道哪里的值,修改建议:把第二行改为:

for(i=0;i<=2;i++,p++)

for(i=1;i<=2;i++,p++)
你这循环只循环了2次啊,也就是说只有2个原始数据
而后面的j循环中,也是循环2次,还比较j和j+1,这都越界了呀
for(p=a;p<=(a+2);p++)
你只有2个原始数据,却输出3个数,是要闹哪样

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7448034
  • 这篇博客你也可以参考下:数组定义及注意事项
  • 除此之外, 这篇博客: 长文详解程序运行是个怎样的环境?预处理阶段在做什么?程序中我们不知道的一些事~中的 6. 宏与函数的优缺点 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 比较内容#define定义宏函数
    代码长度每次使用时,宏代码都会被插入到程序中。除了非常小的宏之外,程序的长度会大幅度增长函数代码只出现于一个地方;每次使用这个函数时,都调用那个地方的同一份代码
    执行速度更快存在函数的调用和返回的额外开销,所以相对慢一些
    操作符优先级宏参数的求值是在所有周围表达式的上下文环境里,除非加上括号,否则邻近操作符的优先级可能会产生不可预料的后果,所以建议宏在书写的时候多些括号函数参数只在函数调用的时候求值一次,它的结果值传递给函数。表达式的求值结果更容易预测
    带有副作用的参数参数可能被替换到宏体中的多个位置,所以带有副 作用的参数求值可能会产生不可预料的结果函数参数只在传参的时候求值一 次,结果更容易控制
    参数类型宏的参数与类型无关,只要对参数的操作是合法 的,它就可以使用于任何参数类型函数的参数是与类型有关的,如 果参数的类型不同,就需要不同的函数,即使他们执行的任务是 不同的
    调试宏是不方便调试的函数是可以逐语句调试的
    递归宏是不能递归的函数是可以递归的

    命名约定:

    • 🎍宏命名全部大写
    • 🎍函数名可以不全大写

  • 您还可以看一下 吴雪峰老师的巧用微信业余创业课程中的 创业成功案例分享,创业注意事项小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题回答:

    问题一:

    根据提供的参考资料中的代码,可以看到程序接受用户输入后,在比较两个字符串时使用了错误的方式,应该使用strcmp函数进行比较,而当前的代码使用的是!=运算符,导致比较结果始终为真,从而始终输出42。修改该部分代码后即可解决问题。

    具体修改步骤:

    1. 在代码文件中进行如下修改:

    将 if (s[i]!=s[i-1]) 改为 if (strcmp(s[i], s[i-1]) != 0)

    1. 编译并运行修改后的代码,测试是否能够输入不同的值。

    问题二:

    根据提供的参考资料中的代码,可以看到程序先定义了一个函数指针变量pmax,将max函数的地址赋值给该指针变量,并在后续代码中输出了不同的变量的地址。针对这里提出的问题,我们可以先理解C语言中函数名的特殊含义。函数名在C中也是一个标识符,通常被用来代表函数的入口地址,所以函数名也可以看作是一个指针变量,指向函数的入口地址。因此,我们可以将函数名和指向函数的指针变量视作等价的,它们的地址在大多数情况下是相同的。

    具体解决方案:

    1. 了解C语言函数名的特殊含义,理解函数名等价于指向函数的指针变量。

    2. 编译和运行提供的代码,查看输出结果,验证函数名和指向函数的指针变量的地址是相同的。

    问题三:

    提供的参考资料中给出了一个定义数组长宽的示例代码,数组ROW和COL用来定义数组的行和列数,而ROWS和COLS则在这基础上考虑数组周围需要增加的一圈缓冲区,以方便数组操作。这种定义方式可以方便后期对数组维度进行管理和修改,同时也减少了硬编码的使用,提高代码的可维护性。

    具体解决方案:

    1. 参考提供的示例代码,采用类似定义的方式来对数组维度进行管理和修改。

    2. 注意在使用数组时,使用定义的常量来代替硬编码的数字,以增强代码的可维护性。

    问题四:

    触发电平是指输入或输出信号的电平上升或下降超过某个阈值时所产生的事件,一般用于电子设备控制和信号检测等方面。在嵌入式系统和电路设计中尤为常见。

    问题五:

    根据提供的参考资料中的说明,CMM语言是一种类似于C语言但语法更简化的程序设计语言,包含多种数据类型、算术、逻辑运算、控制语句等基本特性。在本问题中,需要实现一个CMM语言编译器,生成对应的指令集以便于后期执行。具体实现的过程需要分为编译器前端和编译器后端两部分,前者主要负责源代码的词法分析、语法分析和中间代码生成,后者则负责将中间代码转化为目标机器代码。在实现编译器的过程中,需要对CMM语言的语法结构和语义含义有深入的理解。

    具体解决方案:

    1. 学习CMM语言的基本语法结构、数据类型、运算符、关键字等基本要素。

    2. 学习编译器的实现原理和方法,掌握编译器前端和后端的具体工作流程和任务。

    3. 参考已有的编译器实现,可以采用自己的设计和实现方式,编写一个CMM语言编译器,并生成对应的指令集。