C程序:用函数更新unsigned char指针数组

时间:2015-06-11 15:07:20

标签: c arrays function pointers unsigned-char

我有一个更新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()函数中设置的值都将非常感激。

2 个答案:

答案 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)

问题在于,ptrchangeArray()函数的本地。因此,一旦函数完成执行,就不存在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);