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() 函数中设置的值的任何帮助,我们将不胜感激。

这里的问题是,ptrchangeArray() 函数的本地问题。所以一旦函数执行完毕,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 失败,您还应该进行错误检查,并记住 freemain 中使用后分配的内存。