当我尝试为[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。然而,它只是给我一个分段错误和崩溃。有什么想法吗?
答案 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;)。