C - 用于静态分配的char数组的memset segfault

时间:2012-04-11 16:48:00

标签: c segmentation-fault memset

我尝试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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

&inBuff的类型是指向大小为char的{​​{1}}数组的指针,与IN_BUFF_LEN完全不同。你已经强迫编译器不要抱怨,声称你比编译器更了解你正在做什么。除非你确定你比编译器更了解,否则不要使用类似的演员。

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

char **

但是,我非常怀疑你应该修改//static char inBuff[IN_BUFF_LEN]; char *inBuffS = inBuff; //dynamic char *inBuffD; serverInit(portNum, &inBuffS, &serv_addr, &sockfd); 为第二个参数修改一个简单的serverInit()而不是char *

答案 2 :(得分:0)

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

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

然后调用它

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

然后在serverInit()里面调用memset(),如下所示:

memset(inBuff, 0, IN_BUFF_LEN);

答案 3 :(得分:0)

您的一些困惑是认为&inBuff可以取消引用以获得inBuff。如果你运行这个简单的测试程序:

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

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

正如其他人所说,你应该只是将指针传递给你要设置的内存。希望这个答案可以帮助您进行未来的调试。