2

在下面的代码中,我遇到了 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;
}
4

1 回答 1

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()你会溢出字符串。这会导致未定义的行为。

于 2014-12-26T03:43:21.813 回答