`
paddy.w
  • 浏览: 505009 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C语言中一个函数返回值不一致的问题

    博客分类:
  • C
 
阅读更多
        对于一个只用C写十几二十行程序的菜鸟,也能遇到这样那样诡异郁闷的问题,其实知道点底层也挺好的。先说这个问题:
#include <stdio.h>
#include <malloc.h>
#define max(a,b) ((a)>(b)?(a):(b))

int computeMax(int [], int);
int main() {
    int array[10] = {1,-1,2,2,3,-3,4,-4,5,-5};
    /*printf("\n");*/
    printf("%d\n", computeMax(array, 10));
    return 0;
} 

int computeMax(int a[], int length) {
    int i,j,result;
    int la[length-1], ra[length-1];
    la[0] = a[0],ra[length-2] = a[length-1];
    for(i=1;i<length-2;i++)
        la[i] = max(la[i-1]+a[i], a[i]);
    for(i=length-3;i>=0;i--)
        ra[i] = max(ra[i+1]+a[i+1], a[i+1]);
    result = la[0]+ra[1];
    for(i=0;i<length-1;i++)
        for(j=i;j<length-1;j++)
            result = max(la[i]+ra[j], result);
    return result;
}


        这个程序解决什么问题的就不罗嗦了,不重要……代码中有一句被注释了,这段代码有这两种执行情况:
        A:把注释去掉
        B:带注释执行
        我linux下的编译环境是gcc (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5),编译选项是-Wall -std=c99 -g -lm
        computeMax的正确返回值是13,执行A结果是1175124475,执行B结果是13。很显然A的结果是个乱七八糟的东西。如果其他不变,把computeMax函数改成这样:
int computeMax(int a[], int length) {
    int i,j,result;
    int *la=(int *)malloc((length-1)*sizeof(int)), *ra=(int *)malloc((length-1)*sizeof(int));
    la[0] = a[0],ra[length-2] = a[length-1];
    for(i=1;i<length-2;i++)
        la[i] = max(la[i-1]+a[i], a[i]);
    for(i=length-3;i>=0;i--)
        ra[i] = max(ra[i+1]+a[i+1], a[i+1]);
    result = la[0]+ra[1];
    for(i=0;i<length-1;i++)
        for(j=i;j<length-1;j++)
            result = max(la[i]+ra[j], result);
    free(la);
    free(ra);
    return result;
}

        也就是将数组的直接声明换成malloc分配,不管是否去掉注释,均输出正确结果。如果把程序改成这样:
#include <stdio.h>
#include <malloc.h>
#define max(a,b) ((a)>(b)?(a):(b))

int computeMax(int [], int);
int main() {
    int array[10] = {1,-1,2,2,3,-3,4,-4,5,-5};
    int a = computeMax(array,10);
    /*printf("\n");*/
    printf("%d\n", a);
    return 0;
} 

int computeMax(int a[], int length) {
    int i,j,result;
    int la[length-1], ra[length-1];
    la[0] = a[0],ra[length-2] = a[length-1];
    for(i=1;i<length-2;i++)
        la[i] = max(la[i-1]+a[i], a[i]);
    for(i=length-3;i>=0;i--)
        ra[i] = max(ra[i+1]+a[i+1], a[i+1]);
    result = la[0]+ra[1];
    for(i=0;i<length-1;i++)
        for(j=i;j<length-1;j++)
            result = max(la[i]+ra[j], result);
    return result;
}

        也就是把computeMax的返回值放到一个变量中,并且赋值操作在被注释语句之前完成,那么被注释的语句对执行结果也没有什么影响。
        其实还可以做一些测试,比如在computeMax中返回之前输出一下result。结果也不相同。
        一个简单的printf("\n")换行就能有这样的影响?把代码贴到网上,别人执行也没遇到这问题,很让我困惑。自己猜测可能是由于内存空间被污染了,用malloc自己分配释放空间,就没有问题,如果用程序自动分配就有问题。具体也说不上来什么,还得更细的分析,如果有高手知道具体可能是哪里出了问题,麻烦告知一下。
        PS:http://www.iteye.com/topic/1105480感觉这个问题和上面的问题很像。
分享到:
评论

相关推荐

    详解C语言函数返回值解析

    C语言函数返回值解析是一个非常重要的概念,它关系到程序的正确性和效率。只有当我们正确地理解函数返回值的处理机制和生命周期问题时,才能编写出高效、正确的C语言程序。 知识点: 1.C语言函数返回值的处理机制...

    c函数调用-不使用函数返回值

    本文将深入探讨“C函数调用-不使用函数返回值”的概念,通过分析给定的代码示例,解释不同类型的函数参数传递方式,并讨论其潜在的影响和最佳实践。 ### 函数调用与参数传递 在给定的代码示例中,我们看到了多种...

    嵌入式C语言培训-C编程基础-函数返回值

    虽然C语言不支持函数重载(即同一个函数名但参数列表不同的函数),但在C++中可以实现。C++也不支持函数覆盖(继承类中的函数与基类中同名函数),但子类可以隐藏基类的函数。 通过理解和熟练运用这些知识点,...

    用C语言指针作为函数返回值_C语言中文网1

    指针作为函数返回值能带来灵活性,但也需要遵循一些规则以避免潜在的问题,比如确保返回的指针始终指向有效的内存区域。在编写涉及指针的代码时,应特别注意内存管理,以防止内存泄漏或访问无效内存。通过不断地练习...

    枚举和函数返回值使用---工作内容之总结

    枚举类型和函数返回值是C语言中非常重要的特性,它们能够帮助开发者更好地组织和管理代码。合理利用枚举类型可以提高代码的可读性和可维护性;而通过使用枚举作为函数返回值,则可以让代码更加健壮和易于调试。掌握...

    计算机C语言中常用数学函数的研究.pdf

    计算机C语言中常用数学函数的研究 ...本文对计算机C语言中常用数学函数的研究,旨在为编程人员和研究人员提供一个有价值的参考文献,帮助他们更好地理解和应用数学函数,从而提高编程的效率和质量。

    C语言写字符串函数及任意个数求和

    C语言标准库中的`strcpy`函数用于将一个字符串复制到另一个字符串中。我们也可以自定义一个函数来实现相同的功能。例如,可以创建一个名为`my_strcpy`的函数,接受两个字符指针参数,然后逐个字符地将源字符串复制...

    C语言实验二——函数.

    在程序填空部分,学生需要在给定的代码框架中填充相应的代码,以完成一个自定义函数qiuhe,该函数用于计算三个实型数的和值。学生需要了解函数的参数传递和返回值的使用。 在程序改错部分,学生需要对给定的代码...

    C语言趣味编程及函数表

    这个C语言函数表包含了C标准库中的大量函数,提供了每个函数的详细说明、参数列表、返回值、示例代码以及可能遇到的问题。对于学习者来说,这是一个非常宝贵的参考资料,可以迅速查找并理解如何使用特定的C语言函数...

    C语言函数大全 函数例题

    总结来说,“C语言函数大全”这个资源应该涵盖了函数的各个方面,包括但不限于函数的定义、参数传递、返回值、函数指针、递归、函数优化等。通过对这些例题的学习和实践,学习者能更深入地理解C语言函数的使用,并...

    C语言试卷练习(函数,循环,指针,结构体)

    在问题4中,函数返回值的类型是由return语句中的表达式类型决定的。 5. 在问题5中,程序的输出结果是45。该程序使用了函数和循环来计算两个数组的和。 6. 在问题6中,程序的输出结果是3。该程序使用了指针和数组来...

    提供C语言函数查询器

    本项目提供了一个C语言函数查询器,名为tcsearch.exe,旨在帮助开发者更方便地查找和理解C语言中的各种函数。 函数在C语言中的核心地位不言而喻,它们可以接受输入参数(如果有的话),执行特定任务,并可能返回一...

    C语言参考手册之函数库-非扫描

    在深入学习C语言函数库时,理解每个函数的参数、返回值和可能的错误情况至关重要。例如,`malloc`函数需要指定内存大小,成功时返回指向分配内存的指针,失败时返回NULL。此外,了解如何正确使用内存分配和释放,...

    C语言函数大全+例子

    "C语言函数大全+例子"这个资源显然是为了帮助学习者深入理解和熟练应用C语言中的各种函数。 首先,我们要理解什么是函数。在C语言中,函数是一段可重复使用的代码块,它执行特定任务并可能接收输入(参数)和返回...

    C语言函数大全超级完整版

    `return_type`是函数返回值的类型,如果函数不返回值,可以使用`void`。`function_name`是函数名,应遵循标识符的命名规则。`parameters`是函数参数列表,可以为空,也可以包含多个参数,每个参数有自己的类型和名称...

    全国计算机二级C语言考点:函数的类型和返回值.docx

    全国计算机二级C语言考试中的一个重要考点是函数的类型和返回值。函数在C语言中扮演着核心角色,它们是代码模块化的基础,允许我们将复杂任务分解为更小的、可重用的部分。理解函数的类型和返回值对于编写有效且高效...

    c语言析构函数

    标题和描述中提到的知识点是关于C语言的析构函数,但实际上,析构函数是C++的概念,并非C语言的一部分。然而,基于给定的部分内容,我们可以深入探讨C++中的析构函数及其相关知识点。 ### 析构函数:C++中的资源...

    单片机C语言实例-用P0 、P1口显示整型函数返回值.zip

    在这个实例中,"单片机C语言实例-用P0 、P1口显示整型函数返回值"的代码应该演示了上述步骤。通过分析代码,我们可以学习到如何在实际项目中应用这些概念,如函数设计、位操作和单片机I/O控制。同时,这个实例也是...

    c语言函数(几乎所有的c语言函数)范例教程

    在这个“C语言函数(几乎所有的c语言函数)范例教程”中,你将深入学习C语言的核心部分——函数。函数是C语言中组织代码和实现模块化程序设计的关键元素。 1. **函数定义与调用**: C语言中的函数可以被看作是执行...

    C语言函数全集,7个压缩文件,函数全包了。

    通过这7个压缩文件,你可以系统地学习和查阅C语言中的各种函数,从基本的输入输出函数到复杂的数学运算函数,再到实用的字符串处理函数,全面了解C语言函数的使用和应用。这些资源对于初学者巩固基础知识,以及熟练...

Global site tag (gtag.js) - Google Analytics