【问题标题】:C Program: Update unsigned char pointer array with functionC程序:用函数更新无符号字符指针数组
【发布时间】: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() 函数中设置的值的任何帮助将不胜感激。

【问题讨论】:

    标签: c arrays function pointers unsigned-char


    【解决方案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 失败,您还应该进行错误检查,并记住freemain 中使用后分配的内存。

    【讨论】:

    • 先生,如果我没记错的话,传递blah 本身就可以完成这项工作,不需要指向指针的指针。您能否检查一下我的答案是否正确?
    • 视情况而定。我这样做是因为 OP 传递了 &amp;blah 并使用 *arr=ptr; 更新指针,这通常是指针的更新方式。您所做的方式将修改数组ptr2。因此,如果 OP 想要修改数组 ptr2 也可以。
    • 先生,基于 modified 数组的使用,我得出结论,只有值对 OP 很重要,这就是我建议的原因。毫无疑问,您的方法也绝对正确。 :-)
    【解决方案2】:

    这里的问题是,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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      相关资源
      最近更新 更多