【问题标题】:Passing a pointer to a char array to a function将指向 char 数组的指针传递给函数
【发布时间】:2009-11-29 02:04:14
【问题描述】:

我有一个指向我的 char 数组的指针,像这样。

    unsigned char *recvBuf;
    recvBuf = (unsigned char *)malloc(sizeof(char)*RECVBUF);

然后我将它传递给定义为的函数

void setHeader(MyHeader *myHeader, unsigned char *buffer)

将前 12 个字节复制到结构中

然后我尝试稍后将其传递给另一个函数

Record readRecord(unsigned char *buffer, int *arrayPosition, int buffsize)

但是当我尝试使用 [] 访问数组的任何部分时,程序总是变得无响应,这与在前一个函数中使用的方式完全相同。在我将它传递给函数之前,我也可以像这样访问它。

我们将不胜感激。

谢谢

编辑:

指针是一样的。

这是在第二个函数里面

我将这段代码添加到顶部,它工作得很好

int k = *arrayPosition;
    printf("%p \n", buffer);

    printf("%c \n", buffer[k]);

这是原始代码,程序在 i = *arrayposition 之后变得无响应...

int i, j;
Record *myRecord;
Resource *myResource;
unsigned char name[255];
unsigned char data[50];
unsigned int offset;

i = *arrayPosition;

while(buffer[i] != '\0')
{
    if((buffer[i] & 0xC000) == 0xC000)
    {

【问题讨论】:

  • 你确定你没有修改其中一个函数内的指针值吗?插入数据时是否取消引用指针?
  • 一些风格问题:在 C(但不是 C++)中,转换malloc 的返回值通常被认为是不好的风格,因为void * 被隐式转换为任何其他指针类型。此外,sizeof(char) 在 C(和 C++)中始终为 1,因此乘以它是多余的。第二行代码应该是这样的:recvBuf = malloc(RECVBUF);.
  • 我认为大多数编译器都会消除这种冗余。有时它只是用来写更清晰的代码:size_of_item * number_of_items
  • 有趣的是,您使用的是“无响应”一词,如果您取消引用错误的指针,我预计会崩溃/核心。你有可能在那个 while( buffer[i] != '\0' ) 循环中旋转吗?也许您没有通过某些控制路径增加 i ?

标签: c arrays pointers char function-pointers


【解决方案1】:

真的需要更多的上下文来帮助这里,你所说的没有什么明显的不愉快。

基础知识:

  1. 检查您是否没有索引 结束你的记忆块。
  2. 检查你没有通过 &recvBuf 你要通过的地方 接收缓冲区?编译器应该 抓住这个,但如果你这样做,你会浪费你的堆栈,也许使用演员。

【讨论】:

    【解决方案2】:

    输入不足以确定导致指针变坏的问题,但如果指针在您描述的函数调用之间发生变化,一个很好的方法是检查 gdb。

    您是否修改了数组的任何字符?在这种情况下,您应该使用 * 取消引用指针。

    如果不能使用指针后调用原因可以是:

    1. 在函数内部被错误更改
    2. 它是指向堆栈中已分配值的指针,该值在某处隐式释放(但听起来很奇怪)

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 1970-01-01
      • 2021-09-07
      • 2015-03-17
      • 1970-01-01
      • 2017-08-09
      • 2021-12-02
      • 2012-07-28
      相关资源
      最近更新 更多