c - 除了内存分配之外的段错误

标签 c

我似乎无法弄清楚为什么当我尝试为 [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]; 不是你想的那样。它是一个包含 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);

关于c - 除了内存分配之外的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26296906/

相关文章:

c - Linux C 中的 read(2) 是如何工作的?

c - 使用 C/C++ 的 LibXml2

c - 使用 execl 运行多个 ssh 命令

c - 带描述符的 free() 函数

c - 如何让 GLUT 创建的窗口不可调整大小?

c - 从函数中的数组参数存储指向文件范围内数组的指针

C 指针作为结构成员、分配、初始化

c - 将 -static 与 GCC 一起使用可以保证我的 C 程序可以跨 x86 发行版运行吗?

c - 使用cygwin在windows下构建libevent?

c++ - 在 C/C++ 中同时与 Openssl epoll 服务器通信到多个客户端