2

我的源文件有一个函数,我在反序列化通过 C 套接字传递的结构的过程中调用它(这是客户端源):

MY_STRUCT_TYPE myStructVar;

unsigned char * deserialize_chararr(unsigned char *buffer, unsigned char** value)
{
    unsigned char val[256];
    int i;
    for(i = 0; buffer[i]; i++) {
        val[i] = buffer[i];
    }
    val[i++] = '\0';
    printf("\n chararr: %s :", val);

    *value = malloc(i * sizeof **value);
    for(i = 0; buffer[i]; i++) {
        (*value)[i] = buffer[i];
        printf("%c", (*value)[i]);
    }
    (*value)[i++] = '\0';
    /* buffer contains a serialized struct read over a socket using recv. 
so this call returns the buffer pointer that get's passed to the next deserialize_<type> invocation a la https://stackoverflow.com/a/1577174/434145
That's why the first string extraction followed by an attempt to set it in the struct as part of unpacking. */
    return buffer + i;
}

我称之为

buffer = deserialize_chararr(buffer, &myStructVar->szrecordid);

在哪里

typedef struct _MY_STRUCT_TYPE {
    unsigned char   szrecordid[28];
}

服务器可以正常发送数据,它甚至可以在上述函数中正确解析,但我似乎无法在我的结构的 String 变量中设置它。看到这个后,我将函数更改为使用 char ** 参数,但打印时仍然会出现垃圾

printf("\n Payload:"  "\n szrecordid: %s ", myStructVar.szrecordid);

简而言之,我将一个指针传递给一个字符串 (&myStructVar->szrecordid),使用 malloc 并按字符分配我的指针字符(我从链接中获得的后一部分)。在我将代码从使用 char * 更改为使用 char ** 之前和之后,我都收到了相同的错误和编译器警告:

client.c:159: warning: passing arg 2 of `deserialize_chararr' from incompatible pointer type

那么我做错了什么?

4

3 回答 3

4

问题是指向数组的指针与指向指针的指针不兼容。它们是不同的东西。这也是一件好事,因为这是为了捕捉代码中的错误。你在做什么基本上是这样的:

unsigned char szrecordid[28];
szrecordid = malloc(i * sizeof **value);

您应该能够看到问题;您正在尝试将指针分配给数组。

于 2013-06-30T17:26:07.907 回答
1

如果我理解正确,您的问题是您无法更改 szrecordid 的地址:

typedef struct _MY_STRUCT_TYPE {
    unsigned char   szrecordid[28];
}

如果你不能改变这个变量的地址,那是因为它是一个数组。尝试改用 char * 或不要 malloc 并strcpy改用。

顺便说一句,请考虑使用strcpystrdup何时可以。基本上,您的功能正在执行:

strcpy(val, buffer);
printf("\n chararr: %s :", val);
*value = strdup(buffer);
printf("%s", value);

你也可以注意到第一个 strcpy 也没有用。我不明白这个中间字符数组的含义。

于 2013-06-30T17:27:07.477 回答
1

szrecordid是一个无符号字符数组,而不是指针,所以当你获取它的地址 ( &myStructVar->szrecordid) 时,你会得到一个指向数组 (an unsigned char (*)[28]) 的指针,而不是指向指针的指针,这是函数所期望的。

如果您考虑一下,这很有意义-您不能通过简单地更改其地址来移动数组,因为它的地址(和大小)在分配时是固定的(当您创建myStructVar指向的任何内容时) )。如果要更改该数组,则需要通过复制到其中来更改其内容,并且不会更改固定为 28 的大小。

解决您的问题的明显方法是使其成为指针而不是数组:

typedef struct _MY_STRUCT_TYPE {
    unsigned char   *szrecordid;
}
于 2013-06-30T17:29:04.403 回答