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