C程序:用函数更新无符号字符指针数组
Posted
技术标签:
【中文标题】C程序:用函数更新无符号字符指针数组【英文标题】:C Program: Update unsigned char pointer array with function 【发布时间】:2015-06-11 15:07:19 【问题描述】:我有一个更新unsigned char*
的功能,但找不到我的错误所在。我不确定是否需要分配内存,或者我是否在某处指向错误的内存空间。我尝试遵循与here 发布的类似结构,但没有成功使用unsigned char
。
到目前为止我的代码:
#include <stdio.h>
void changeArray(unsigned char **arr)
unsigned char ptr[3] = 100, 101, 102;
*arr = ptr;
printf("%d\n", **(arr+0)); // This prints out the correct value of 100
int main(int argc, const char* argv[])
int i = 0;
unsigned char *blah;
unsigned char ptr2[3] = 103, 104, 105;
blah = ptr2;
printf("Blah is: \n");
for (i = 0; i < 3; i++)
printf("%d,",*(blah+i)); //This prints out 103,104,105
changeArray(&blah);
printf("Blah is now: \n");
for (i = 0; i < 3; i++)
printf("%d,", *(blah +i)); //This prints out 0,0,0
return 0;
在确定如何正确访问 changeArray() 函数中设置的值的任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:使用这个*arr = ptr;
,您正在存储一个指向具有自动存储持续时间的变量的指针。行为undefined。
您可以通过这种方式动态分配和返回指针:
void changeArray(unsigned char **arr)
unsigned char ptr[3] = 100, 101, 102;
unsigned char *p = malloc(sizeof ptr);
memcpy(p, ptr, sizeof ptr);
*arr = p;
printf("%d\n", **(arr+0)); // This prints out the correct value of 100
如果malloc
失败,您还应该进行错误检查,并记住free
在main
中使用后分配的内存。
【讨论】:
先生,如果我没记错的话,传递blah
本身就可以完成这项工作,不需要指向指针的指针。您能否检查一下我的答案是否正确?
视情况而定。我这样做是因为 OP 传递了 &blah
并使用 *arr=ptr;
更新指针,这通常是指针的更新方式。您所做的方式将修改数组ptr2
。因此,如果 OP 想要修改数组 ptr2
也可以。
先生,基于 modified 数组的使用,我得出结论,只有值对 OP 很重要,这就是我建议的原因。毫无疑问,您的方法也绝对正确。 :-)【参考方案2】:
这里的问题是,ptr
是 changeArray()
函数的本地函数。所以一旦函数完成执行,ptr
就不存在了。因此,一旦将ptr
分配给*arr
*arr = ptr;
并且changeArray()
执行结束,在main()
中访问blah
现在将调用undefined behaviour。
FWIW,你不需要传递blah
的地址,你根本不需要指向指针的指针。 blah
已经是一个指针,您可以将其传递给 changeArray()
以更改它指向的内存区域的内容。你可以做类似的事情
void changeArray(unsigned char *arr)
for (int i = 0; i < 3; i ++)
arr[i] = 100+i;
然后这样称呼它
changeArray(blah);
【讨论】:
以上是关于C程序:用函数更新无符号字符指针数组的主要内容,如果未能解决你的问题,请参考以下文章
C 语言数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )