簡體   English   中英

除內存分配外的分段錯誤

[英]Segmentation Fault besides memory allocation

我似乎無法弄清楚為什么在嘗試為[0]賦值時給char * []的賦值給我一個分段錯誤。

所以我的意思是,我創建了一個

char * temp[255]

這應該為臨時堆分配空間。 因此,當我這樣做

while(buffer)
{
    for(num = 0; num < i; num++)
    {
        if(strcmp(temp[i], buffer) == 0)
        {
            break;
        }
    }

    /* send menu choice to server indicating client wants list of all files on server */
    if (sendto(sock, menuOption, sizeof(menuOption), 0, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0)
    {
        printf("sendto() sent a different number of bytes than expected");
    }

    /* receive a response from the server */
    fromSize = sizeof(fromAddr);
    if ((recvDataLen = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *) &fromAddr, &fromSize)) < 0)
    {   
        printf("recvfrom() failed\n");
    }

    if(serverAddr.sin_addr.s_addr != fromAddr.sin_addr.s_addr)
    {
        fprintf(stderr,"Error: received a packet from unknown source.\n");
        exit(1);
    }

    /* null terminate the received data */
    buffer[recvDataLen] = '\0';
    strcpy(temp[i], buffer);
    i++;
    printf("%s\n", buffer);    /* Print the echoed arg */
}

我不應該遇到分段錯誤,因為我已初始化為0(因為我與套接字屬性一起位於文件的頂部,所以未在此處顯示初始化)。 因此,在while循環的第一次迭代中,for循環不執行任何操作,因為num和i均為零,因此它將繼續向服務器發送數據並從服務器檢索數據。 該數據將放入緩沖區,然后應復制到臨時文件中。 但是,這只是給我一個分段錯誤而崩潰。 有什么想法嗎?

您的char* temp[255]; 不是你的想法。 它是255個指針的數組。 不是字符串。 您的指針未初始化,因此它們指向完全隨機的位置,這會導致分段錯誤。 為了避免這種情況,您需要為每個指針分配內存。

char* temp[255] = {0}; // set all pointers to 0
//...
for(num = 0; num < i; num++)
{
   if(temp[i] != 0 && strcmp(temp[i], buffer) == 0) // if a pointer is 0 (uninitialized), do not access it
   {
      break;
   }
}
//...
temp[i] = malloc(size); // probably (strlen(buffer) + 1) (except you use something else for buffer)
if(temp[i] == NULL)
{
// something bad happend.
}
strcpy(temp[i], buffer);

您已聲明255個指針的數組:

char * temp[255];

因此,您可以使用以下方法執行以下操作:

char actual_data[5] = {0};
strcpy (actual_data, "Heya");
temp[0] = actual_data;     //temp[0] now points to "heya"

但是您不能做:

strcpy (temp[0], actual_data);

這是因為temp [0]是一個指針,除了4/8字節(等於整數)之外,沒有任何自己的內存。 如果要strcpy,則需要分配內存。 您可以執行以下操作:

char actual_data[5] = {0};
strcpy (actual_data, "Heya");
char *temp[255];
for (i=0; i<255; i++) 
{
     temp[i] = (char *)malloc (sizeof(actual_data) * sizeof(char));
     strcpy (temp[i], actual_data);
} 

這只是一個示例,其中所有255個指針都將指向Actual_data(因此為“ heya”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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