二维数组赋值给一维数组,子函数返回获取临时变量的指针导致问题

Posted xhoufei2010

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维数组赋值给一维数组,子函数返回获取临时变量的指针导致问题相关的知识,希望对你有一定的参考价值。

1 说明

在C语言中,如果从子函数获取指针,然后将指针拷贝给其他数据,容易出现拷贝不成功。这是因为子函数的变量,分配在栈上,当子函数退出时,对应的变量也生命周期结束。如果此时在将指针指向的数据拷贝,容易出现拷贝不成功。

2 问题代码示例

#include <stdio.h>

unsigned char* GetArray(int num)

        unsigned char code[3][10] =
        
                0x01, 0xa2, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
                0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
                0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
        ;

        return code[num];



int main(int argc, char** argv)
        
        int i = 0;
        unsigned char buf[10];
        
        memset(buf, 0, sizeof(buf) / sizeof(buf[0]));
        memcpy(buf, GetArray(1), 10);
        for (i = 0; i < 10; i++)
        
                printf("buf[%d] = %02d, 0x%02x\\n", i, buf[i], buf[i]);
         

代码看起来没什么问题,但是,对于子函数GetArray, 二维素组是一个临时变量,函数返回拷贝的是临时变量的地址。这样,如果在简单的单线程程序不会有问题,但是在多线程或者大一些的程序中如此操作,那么,返回的指针,指向的地址,数据将会变为不可预计的。

3 修改方法

将子函数中,定义的二维数组,改为 static 或者全局变量,如此,GetArray 函数返回的地址,是一直存在,不会随着子函数结束而导致改地址的数据改变。

unsigned char* GetArray(int num)

        static unsigned char code[3][10] =
        
                0x01, 0xa2, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
                0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
                0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
        ;

        return code[num];

测试结果

将修改后的程序编译并运行,结果如下,正常获取数据。

buf[0] = 17, 0x11
buf[1] = 18, 0x12
buf[2] = 19, 0x13
buf[3] = 20, 0x14
buf[4] = 21, 0x15
buf[5] = 22, 0x16
buf[6] = 23, 0x17
buf[7] = 24, 0x18
buf[8] = 25, 0x19
buf[9] = 26, 0x1a

以上是关于二维数组赋值给一维数组,子函数返回获取临时变量的指针导致问题的主要内容,如果未能解决你的问题,请参考以下文章

返回一个二维整数数组中最大子数组的和

返回一个二维整数数组中最大子数组的和

qt 中能不能用一个指向数组的指针对另一个数组赋值

C语言中怎么把一维数组赋给另外一个一维数组

怎么给一个二维数组赋不同的值

C++二维数组给一维数组赋值