我尝试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]”情况的理解不完整。但是我一直在敲打这个太长时间,无法从树上看到森林,所以任何提示和建议都会非常感激。
答案 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
,您将把数组的前几个字节作为地址。
正如其他人所说,你应该只是将指针传递给你要设置的内存。希望这个答案可以帮助您进行未来的调试。