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