【发布时间】:2014-09-10 01:19:13
【问题描述】:
我正在尝试将一个数组及其长度从一个函数返回到另一个函数。我了解到,我不能简单地使用 sizeof() 确定父函数中返回数组的大小,因为数组在作为参数传递时会简化为指针。我发现我可以use a struct 将数组指针和大小返回给父函数,这就是我正在尝试的。
数组是 unsigned char* 类型,因为我正在处理内存地址。数组在发送到结构之前看起来很好。一旦我尝试通过父函数中的结构引用数组,所有内存地址都会被拆分。我有一种预感,结构填充可能是问题所在。
我已经写了一些打印来真正分析发生了什么。
struct arrayPasser{
int length;
unsigned char *arr;
};
unsigned char *arr[arrLength]; /*array of pointers*/
/*filling out the array with addresses*/
struct arrayPasser pass;
pass.length=arrLength;
pass.arr=&arr;
printf("pass.arr: %#x\n", pass.arr); /*print array location*/
printf("*(&arr): %#x\n", *(&arr));
printf("**(&arr): %#x\n", **(&arr));
/*original array*/
printf("arr[0] %#x\n", arr[0]);
printf("arr[1] %#x\n", arr[1]);
printf("arr[2] %#x\n", arr[2];
/*referencing array through struct*/
printf("0 offset: %#x\n", *pass.arr);
printf("1 offset: %#x\n", *(pass.arr+1));
printf("2 offset: %#x\n", *(pass.arr+2));
printf("3 offset: %#x\n", *(pass.arr+3);
printf("4 offset: %#x\n", *(pass.arr+4));
printf("5 offset: %#x\n", *(pass.arr+5));
printf("6 offset: %#x\n", *(pass.arr+6));
printf("7 offset: %#x\n", *(pass.arr+7));
printf("pass.arr[0]: %#x\n", pass.arr[0]);
printf("pass.arr[1]: %#x\n", pass.arr[1]);
printf("pass.arr[2]: %#x\n", pass.arr[2]);
printf("pass.arr[3]: %#x\n", pass.arr[3]);
printf("pass.arr[4]: %#x\n", pass.arr[4]);
printf("pass.arr[5]: %#x\n", pass.arr[5]);
printf("pass.arr[6]: %#x\n", pass.arr[6]);
printf("pass.arr[7]: %#x\n", pass.arr[7]);
输出(注意 arr[0] 是一个完整的 32 位地址,但 pass.arr[0] 只是 32 位地址的一个字节):
arr[0] 0x4affb000
arr[1] 0x4affd000
arr[2] 0x4affc000
pass.arr: 0x58dcf10
*(&arr): 0x58dcf10
**(&arr): 0x4affb000
0 offset: 0
1 offset: 0xb0
2 offset: 0xff
3 offset: 0x4a
4 offset: 0
5 offset: 0xd0
6 offset: 0xff
7 offset: 0x4a
pass.arr[0]: 0
pass.arr[1]: 0xb0
pass.arr[2]: 0xff
pass.arr[3]: 0x4a
pass.arr[4]: 0
pass.arr[5]: 0xd0
pass.arr[6]: 0xff
pass.arr[7]: 0x4a
【问题讨论】:
-
&arr不是unsigned char *。 -
我只是在将其发送到结构之前将其类型转换为
unsigned char *,并且它保留了它的正确值,所以我不确定这是问题的根源,但很高兴知道。跨度> -
演员阵容毫无意义。只需使用
arr。 -
你不能用
unsigned char *arr;表示一个指针数组。这表示一个 char 数组(或一个简单的 char 指针)。 -
我使用
unsigned char *是因为我在嵌入式系统上使用原始内存,我想我会接受 this question 的建议。
标签: c arrays pointers memory struct