1

尝试memset静态分配的字符数组时出现段错误,但对于使用malloc.

变量定义:

    //static
    char inBuff[IN_BUFF_LEN];
    //dynamic
    char * inBuffD;

函数调用:

    //static, cast used because char** != char (*) [n]
    serverInit(portNum, (char**) &inBuff, &serv_addr, &sockfd)
    //dynamic
    serverInit(portNum, &inBuffD, &serv_addr, &sockfd)

在函数内使用:

    memset(*inBuffAdr, 0, IN_BUFF_LEN);

我怀疑我的问题在于函数调用的差异,或者更准确地说,我对“char**!= char (*) [n]”情况的不完全理解。但我一直在敲打这个太久了,不能从树上看到森林,所以任何提示和建议将不胜感激。

4

4 回答 4

4

只需发送 inBuff(不是 **inBuff)然后 memset inBuffAdr 而不是 *inBufAdr(您的其他 memset 可能也不起作用,您只是还不知道)

于 2012-04-11T16:56:20.023 回答
1

为什么需要将双指针传递给serverInit()函数?如果函数可以修改指针指向的位置,则不能传递静态分配的数组。如果函数无法修改指针指向的位置,则不需要双指针。

的类型&inBuff是指向char大小数组的指针IN_BUFF_LEN,这与 a 完全不同char **。你已经让编译器不抱怨了,声称你比编译器更了解你在做什么。除非您确定您确实比编译器了解更多,否则不要使用这样的强制转换。

坦率地说,鉴于目前的原型,你可能最好:

//static
char inBuff[IN_BUFF_LEN];
char *inBuffS = inBuff;
//dynamic
char *inBuffD;

serverInit(portNum, &inBuffS, &serv_addr, &sockfd);

但是,我非常怀疑您应该修改serverInit()为采用简单char *的而不是char **第二个参数。

于 2012-04-11T16:58:24.857 回答
0

为什么不定义serverInit()以下方式:

serverInit(...., char * inBuff, ....)

然后调用它

serverInit(...., inBuff, ....)

然后像这样在内部serverInit()调用memset()

memset(inBuff, 0, IN_BUFF_LEN);
于 2012-04-11T16:56:41.807 回答
0

您的部分困惑在于认为&inBuff可以取消引用 get inBuff。如果你运行这个简单的测试程序:

#include <stdio.h>
char inBuff[1000];
int main( int argc, char *argv[])
{
    printf( "%p %p\n", inBuff, &inBuff);
    return 0;
}

您会看到它为两种表示法打印相同的地址。如果您尝试取消引用&inBuff,您将把数组的前几个字节作为地址。

正如其他人所说,您应该只传递一个指向您要设置的内存的指针。希望这个答案能帮助您进行未来的调试会话。

于 2012-04-11T17:25:13.807 回答