繁体   English   中英

为什么C函数不使用char **参数设置指向char [] arg的指针的值

[英]Why doesn't C function with char** param set value of a pointer to char[] arg

我的源文件具有一个函数,该函数在对通过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 ** param,但打印时仍会出现垃圾

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

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

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

那我在做什么错?

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

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

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

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

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

而且,如果您不能更改此变量的地址,那是因为它是一个数组。 尝试使用char *代替,或者不要malloc,而使用strcpy

顺便说一句,请考虑strdup使用strcpystrdup 基本上,您的函数正在执行:

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

您可能还会注意到,第一个strcpy也没有用。 我不明白这个中间字符数组的含义。

szrecordid是一个无符号字符数组,而不是一个指针,因此当您查询其地址( &myStructVar->szrecordid )时,您将获得一个指向数组的指针(一个unsigned char (*)[28] ),而不是一个指向指针的指针,这是该功能所期望的。

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

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

typedef struct _MY_STRUCT_TYPE {
    unsigned char   *szrecordid;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM