我有一个更新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()函数中设置的值都将非常感激。
答案 0 :(得分:2)
使用此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
}
,您将存储指向具有自动存储持续时间的变量的指针。行为undefined。
您可以通过以下方式动态分配和返回指针:
malloc
如果free
失败,您还应该进行错误检查,并在main
中使用后记住{{1}}已分配的内存。
答案 1 :(得分:1)
问题在于,ptr
是changeArray()
函数的本地。因此,一旦函数完成执行,就不存在ptr
。因此,一旦您将ptr
分配给*arr
*arr = ptr;
和changeArray()
执行结束,访问blah
中的main()
现在将调用undefined behaviour。
FWIW,您不需要传递blah
的地址,根本不需要指向指针的指针。 blah
已经是一个指针,您可以将其传递给changeArray()
以更改它指向的内存区域的内容。你可以做点什么
void changeArray(unsigned char *arr)
{
for (int i = 0; i < 3; i ++)
arr[i] = 100+i;
}
并将其称为
changeArray(blah);