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

时间:2015-08-06 07:27:45

标签: c string pointers split segmentation-fault

分割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;
}

2 个答案:

答案 0 :(得分:4)

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

 lastelem=atoi(str5);

str5未初始化。所以它正在调用undefined behaviour

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

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

答案 1 :(得分:2)

str5

中移动您的case3相关内容
case 3: str5 = buff;
lastelem = atoi(str5);
sprintf(str5, "%d", lastelem);
break;

此外,不需要为buff分配内存,你没有在其中复制内容,你只是指着一些东西,这会导致代码中的内存泄漏。