簡體   English   中英

C-靜態分配的char數組的memset segfault

[英]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_LENchar數組的指針,該數組與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM