我似乎无法弄清楚为什么当我尝试为 [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/