[英]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.