拆分包含 IP 地址的数组时出现分段错误

Segmentation Fault while Splitting an Array containing IP Address

拆分 IP 地址后,我想挑选出最后一个元素,即 15 并递增它,但是在 buff 中得到 192 后,当它进入第一种情况时,我得到了分段错误!

为什么不能更进一步?可能是什么问题?

int main(int argc, char** argv) 
{

char str[] = "192.168.10.15"; 
char str1[12];
char *str2, *str3, *str4, *str5;
unsigned char bytes[4];
int i = 0;

int lastelem; 

char* buff = (char *)malloc(20);
buff = strtok(str,".");


while (buff != NULL)
{
   printf("%s\n",buff);

   switch(i)
   {
       case 0: str2=buff;
       break;

       case 1: str3=buff;
       break;

       case 2: str4=buff;
       break;

       case 3: str5=buff;
       break;
   } 

   lastelem=atoi(str5);
   sprintf(str5, "%d",lastelem);

   bytes[i] = (unsigned char)atoi(buff);
   buff = strtok(NULL,".");
   i++;
}
return 0;
}

在您的代码中,在第一次迭代中,(或者,对于这种情况,在任何其他迭代中,除非 case 3 被命中

 lastelem=atoi(str5);

str5 未初始化,因此它正在调用 undefined behaviour.

只有在分配后才能使用 str5。如果需要,您可以使用标志来标记 case 3: 上的 hit,或者将代码放在 case 块本身下。

此外,您不需要为 buff 分配内存,因为您正在用 strtok() 返回的指针覆盖它。这会创建一个 memory leak.

移动 str5 相关的东西,在 case3

里面
case 3: str5 = buff;
lastelem = atoi(str5);
sprintf(str5, "%d", lastelem);
break;

另外,不需要给buff分配内存,你不是在里面复制东西,你只是指向东西,这会导致你的代码内存泄漏。