拆分包含 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分配内存,你不是在里面复制东西,你只是指向东西,这会导致你的代码内存泄漏。
拆分 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分配内存,你不是在里面复制东西,你只是指向东西,这会导致你的代码内存泄漏。