分割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;
}
答案 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分配内存,你没有在其中复制内容,你只是指着一些东西,这会导致代码中的内存泄漏。