分段故障除了内存分配

时间:2014-10-10 10:07:24

标签: c

当我尝试为[0]分配值时,我似乎无法弄清楚为什么我对char * []的赋值给了我一个分段错误。

所以我的意思是,我创建了一个

char * temp[255]

应该在堆中为temp分配空间。因此,当我做

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都为零,因此它继续将数据发送到服务器并从服务器检索数据。该数据被放入缓冲区,然后应该复制到temp。然而,它只是给我一个分段错误和崩溃。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您的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);

答案 1 :(得分:1)

您声明了一个包含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(因此&#34; heya&#34;)。