在下面的代码中,我一直面临着strtol函数的一些异常行为,因为它没有返回与作为第二个参数传递给expcmp函数的字符串相关联的最后一个值。我没有看到第一个字符串的相同行为。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int16_t expcmp( char* exp_cmp,char* exp_val)
{
char DELIM='.';
int16_t rc=1;
char *p=NULL;
char *temp=NULL;
if(strlen(exp_cmp)>0)
{
p=(char*)malloc(sizeof(strlen(exp_cmp)+1));
strcpy(p,exp_cmp);
printf("p=%s\n",p);
}
if(strlen (exp_val)>0)
{
temp=(char*)malloc(sizeof(strlen(exp_val)+1));
strcpy(temp,exp_val);
printf("temp=%s\n",temp);
}
while (*temp) {
if (isdigit(*temp)) {
int16_t val = strtol(temp, &temp, 10);
printf("temp=%d\n",val);
}
else if(*temp!=DELIM)
{
rc=0;
break;
}
temp++;
}
while (*p) {
if (isdigit(*p)) {
int16_t val = strtol(p, &p, 10);
printf("val=%d\n",val);
}
else if(*p!=DELIM)
{
rc=0;
break;
}
p++;
}
return rc;
}
int main()
{
int ret_code;
ret_code=expcmp(".1.7.8.29.41.8153",".1.7.8.29.41.8153");
return 0;
}
答案 0 :(得分:3)
您没有为字符串分配足够的空间。您不应使用sizeof(strlen(...)+1)
,只需使用strlen(...)+1
。
p=malloc(strlen(exp_cmp)+1);
temp=malloc(strlen(exp_val)+1);
sizeof(strlen(...)+1
只是size_t
值的大小(可能是8个字节),而不是您要复制的字符串的长度。所以你分配的字符串不够长,当你执行strcpy()
时,你就会溢出字符串。这会导致未定义的行为。