一个int变量引起的随机数异常问题

  1. 1、问题描述
  2. 2、问题复现
  3. 3、问题修复
  4. 4、经验总结

1、问题描述

在调试一个程序时,在linux64位系统下出现返回较大负数随机数返回值的现象。

2、问题复现

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

typedef struct _handle_s
{
    unsigned char* srcbuf;
    unsigned char* dstbuf;
    int        index;
    int        iWidth;
    int     iHeight;
}handle_s;


int mem_alloc_check_function(handle_s* h, int width, int height)
{
    h->srcbuf = (unsigned char*)malloc(width*height*3/2*sizeof(unsigned char));
    if (h->srcbuf==NULL)
    {
        return -1;
    }


    h->dstbuf = (unsigned char*)malloc(width*height*3/2*sizeof(unsigned char));
    if (h->dstbuf==NULL)
    {
        return -1;
    }

}

int mem_release_function(handle_s* h)
{
    if (h->srcbuf !=NULL)
    {
        free(h->srcbuf);
    }
    if (h->dstbuf !=NULL)
    {
        free(h->dstbuf);
    }
}

int main(int argc, char* argv[])
{
    int ret;                    //测试:变量定义之后没有初始化
    int i = 0;
    handle_s video_handle = {0};

    int width = 1280;
    int height = 720;

    //while(i++ < 1000)
    {
        ret = mem_alloc_check_function(&video_handle, width, height);
        printf("[int_ret_test] ret: %d\n", ret);
        mem_release_function(&video_handle);

    }
    return  ret;
}

在windows平台下:

在Linux64位平台下:

测试发现,在windows平台下返回值都是很大的正数随机值;在linux平台下返回值会出现较大的负数随机值值或正数随机值。

3、问题修复

1、main中ret定义时立即初始化,

int ret = 0;

2、mem_alloc_check_function函数在最后添加:

return 0;

4、经验总结

(1). 变量定义时需要立即初始化,否则该变量会成为一个随机数;
例如:
int变量初始化为0;
指针变量初始化为NULL。
(2). 在需要返回值的函数中需要给出一个返回值,否则该函数可能会返回一个随机值。
(3). 在不同系统平台下,相同的程序代码可能返回不同的运行结果或现象,需要注意不同系统平台的差异。


THE END!


本博文只能阅读,谢绝转载,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2963033731@qq.com

文章标题:一个int变量引起的随机数异常问题

字数:435

本文作者:Soaring Lee

发布时间:2020-03-14, 20:07:17

最后更新:2021-08-23, 23:08:12

原始链接:https://soaringleefighting.github.io/2020/03/14/【Bugfix系列】一个int变量引起的随机数异常问题/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏

相册