【问题标题】:how to access unsigned char array from inside function in C?如何从 C 中的函数内部访问 unsigned char 数组?
【发布时间】:2017-07-31 16:27:13
【问题描述】:

我正在尝试从函数 readfile 访问名为 buf 的缓冲区。当我打印 sizeof(buf) 时,我看到 buf 有 4 个字节(指针)。另一方面,如果我将 printf 命令粘贴到 readFiles 上,我可以看到大小为 2916。实际上,我不明白为什么它不是 729,但很明显我无法访问 readfile 中的 buf我需要。所以问题是; 问题出在哪里以及如何解决?

void readfiles(FILES * files){
    unsigned char * buf [1*729];
    int skip_lines = 14;
    int shift = 0;
    char * filename = "file.txt";
    // printf("buf size %d", sizeof(buf));
    readfile(filename, skip_lines, buf, shift);
}
int readfile(char * name, int skip, unsigned char * buf, int shift ){
 // buf is (unsigned char *) on address 0x22dd18 ""
    printf("buf size %d", sizeof(buf));
}

【问题讨论】:

  • 只需将unsigned char * buf [1*729]; 更改为unsigned char buf [1*729];,你的问题就会突然消失(好吧,至少去别处)
  • buf 是四个字节和 4 * 729 = 2916。您声明了一个指针数组。
  • 删除指针解决了一个问题(现在大小为 729)。但是当我删除指针时,我仍然无法访问 buf(大小仍然是 4)。另外,当我删除指针时,数据是否会保存在缓冲区中?
  • 哪一行打印 4 个字节?

标签: c arrays pointers


【解决方案1】:

如果将数组作为指针传递给 C 函数,则无法检测其长度。

int readfile(char * name, int skip, unsigned char * buf, int shift ){
// nothing you do in here can tell how big buf is
}

如果您需要知道 buf 的长度,您必须将其作为参数传入

int readfile(char * name, int skip, unsigned char * buf,int blen, int shift ){
...
}

【讨论】:

    【解决方案2】:

    readfile()

    printf("buf size %d", sizeof(buf));
    

    这打印 4 因为 buf 是一个指针,正如您所理解的那样。 readfiles() 中的相同打印语句。打印一个更大的数字,因为 buf 是一个数组。

    正如 pm100 所说,您无法从指向该数组的指针中获取数组的大小。此外,您需要非常小心地访问指针。如果它们没有指向有效的内存地址,那么您将遇到很多错误。这些很难追踪,因为问题会出现在代码的其他部分,而不是指针错误所在的位置。我建议您了解malloc()free(),以便为您的指针动态分配内存。

    【讨论】:

    • 我知道使用malloc,你认为我应该在这里使用它而不是unsigned char数组吗?
    • @user1141649 我认为这里没有任何“替代”。 readfiles() 中的 unsigned char 数组似乎是合适的。但是,在 readfiles() 中有一个 指针 数组。那些需要指向一些有效的内存地址,否则你会遇到问题。或者也许这是一个错误,应该是一个 unsigned char 数组。
    猜你喜欢
    • 2020-10-11
    • 2017-07-12
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2013-05-16
    • 2012-05-06
    • 1970-01-01
    • 2012-02-14
    相关资源
    最近更新 更多