C程序:用函数更新unsigned char指针数组
C Program: Update unsigned char pointer array with function
我有更新 unsigned char*
的功能,但找不到我的错误所在。我不确定我是否需要分配内存,或者我是否指向错误的内存 space 某处。我尝试遵循与发布 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() 函数中设置的值的任何帮助,我们将不胜感激。
这里的问题是,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);
使用此 *arr = ptr;
您将存储一个指向具有 自动存储持续时间 的变量的指针。行为 undefined.
您可以这样动态分配和 return 一个指针:
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
中使用后分配的内存。
我有更新 unsigned char*
的功能,但找不到我的错误所在。我不确定我是否需要分配内存,或者我是否指向错误的内存 space 某处。我尝试遵循与发布 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() 函数中设置的值的任何帮助,我们将不胜感激。
这里的问题是,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);
使用此 *arr = ptr;
您将存储一个指向具有 自动存储持续时间 的变量的指针。行为 undefined.
您可以这样动态分配和 return 一个指针:
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
中使用后分配的内存。