【问题标题】:Segmentation Fault besides memory allocation除内存分配外的分段错误
【发布时间】:2018-04-06 00:41:03
【问题描述】:

当我尝试将值分配给 [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 */
}

我不应该遇到分段错误,因为 i 已初始化为 0(我没有在此处显示初始化,因为 i 与套接字属性一起设置在文件的顶部)。所以在 while 循环的第一次迭代中,for 循环什么都不做,因为 num 和 i 都为零,因此它继续向服务器发送数据并从服务器检索数据。该数据被放入缓冲区,然后应该被复制到临时。然而,它只是给我一个分段错误和崩溃。任何想法为什么?

【问题讨论】:

  • char * temp[255] 为指向 char 的 255 个指针分配空间。但是,从您显示的代码中,这些指针指向无处,会说没有被初始化。
  • 我想,你的意思是,char temp[255]
  • for 循环不会增加 i ...
  • 您所展示的只是一个包含 255 个未初始化指针的数组。向我们展示初始化代码。
  • 编译时包含所有警告和调试信息 (gcc -Wall -g)。然后使用调试器 (gdb)

标签: c


【解决方案1】:

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

【讨论】:

  • 你为什么要为 temp[i] 做 malloc?
  • 所以你仍然有复制粘贴的非 i-incrementing for-loop。
  • 为什么要增加 i?
  • 我并不是说你应该增加i。我只是想指出这个无用的循环。 ;-)
  • for 循环中的 temp[i] 应该是 temp[num]。那是我的错误
【解决方案2】:

你已经声明了一个包含 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 个指针都将指向实际数据(因此为“heya”)。

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2020-03-29
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多