[英]C - memset segfault for statically allocated char array
嘗試對靜態分配的字符數組進行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]”情況的不完全了解。 但是我一直在為此撞撞太久了,從樹上看不到森林,所以任何提示和建議將不勝感激。
只需發送inBuff(不是** inBuff),然后發送memset inBuffAdr而不是* inBufAdr(您的其他memset可能也不起作用,您只是還不知道)
為什么需要將雙指針傳遞給serverInit()
函數? 如果函數可以修改指針指向的位置,那么您將無法傳遞靜態分配的數組。 如果函數無法修改指針指向的位置,則不需要雙指針。
&inBuff
的類型是指向大小為IN_BUFF_LEN
的char
數組的指針,該數組與char **
完全不同。 您已經使編譯器無怨無悔,聲稱您比編譯器更清楚自己的工作。 除非確定您確實比編譯器了解更多,否則不要使用這樣的強制轉換。
坦白地說,考慮到當前的原型,您可能最好選擇:
//static
char inBuff[IN_BUFF_LEN];
char *inBuffS = inBuff;
//dynamic
char *inBuffD;
serverInit(portNum, &inBuffS, &serv_addr, &sockfd);
但是,我非常懷疑您應該修改serverInit()
以將簡單的char *
而不是char **
用作第二個參數。
為什么不通過以下方式定義serverInit()
:
serverInit(...., char * inBuff, ....)
然后叫它
serverInit(...., inBuff, ....)
然后在serverInit()
內部調用memset()
如下所示:
memset(inBuff, 0, IN_BUFF_LEN);
您的部分困惑是認為可以將&inBuff
引用為inBuff
。 如果運行此簡單的測試程序:
#include <stdio.h>
char inBuff[1000];
int main( int argc, char *argv[])
{
printf( "%p %p\n", inBuff, &inBuff);
return 0;
}
您會看到,它為兩種表示法打印相同的地址。 如果嘗試取消引用&inBuff
,則將數組的前幾個字節作為地址。
正如其他人所說,您應該只傳遞一個指向要設置的內存的指針。 希望這個答案將對以后的調試會議有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.