我不应该在没有警告的情况下获得作业?

Inv*_*Zim 2 c pointers casting compiler-warnings

我正在写一个字符串拆分函数.

所以,这个功能正在发挥作用.至少对我做的测试.

但在编译期间,我得到了

user/user_main.c:53:7:警告:赋值从整数中生成没有强制转换的指针[默认启用] splt = str_split(&length,pokusaj,'');

我不明白是什么问题.后来在我的代码中,我正常使用splt/length并获得所需的结果.那么,为什么我会收到这个警告?如果我强制转换它,警告会消失(显然),但是我不想抛出它,函数返回它返回的内容,所以我不需要强制转换结果.

码:

uint8_t** str_split(uint32_t* length, uint8_t* toSplit, uint8_t delimiter){
    uint8_t* curr = toSplit;
    uint8_t** poses = (uint8_t**) os_malloc(sizeof(uint8_t*)*STRTOK_MAX_LEN);
    uint32_t pos = 0;
    uint32_t len;
    uint8_t** dst;

    os_printf("String:--%s--\n", toSplit);

    while(pos < STRTOK_MAX_LEN) poses[pos++] = NULL;

    pos = 0;
    poses[pos++] = curr;
    curr++;
    while((curr = os_strchr(curr, delimiter) ) != NULL && pos < STRTOK_MAX_LEN){
        poses[pos++] = curr;
        curr++;
    }

    if(pos == 0) return 0;
    dst = (uint8_t**) os_malloc(sizeof(uint8_t*) * (pos));

    pos = 0;
    while(pos < STRTOK_MAX_LEN-1 && poses[pos] != NULL){
        if(poses[pos+1] != NULL){
            len = (poses[pos+1] - poses[pos]);
            if(poses[pos][0] == delimiter)
                len -= 1;
        }
        else{
            len = os_strlen(toSplit) - (poses[pos]-toSplit) - 1;    
        }

        if(len > 1){
            dst[pos] = (uint8_t*) os_malloc(len+1);
            os_memset(dst[pos], '\0', (len+1));
            if(poses[pos][0] == delimiter)
                os_memcpy(dst[pos], poses[pos]+1, len);
            else
                os_memcpy(dst[pos], poses[pos], len);
            os_printf("Length:%d\n", len);
            os_printf("Item:--%s--\n", dst[pos]);
        }
        else{
            dst[pos] = NULL;
        }

        pos++;
    }

    *length = pos;

    return dst;
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼它:

uint32_t length = 0;
uint8_t** splt;
splt = str_split(&length, pokusaj, ' ');

os_printf("len=%d\n", length);
os_printf("splt=%u\n", splt);
uint32_t i;
for(i=0; i<length; i++){
    os_printf("printing %d\n", i);
    if(splt[i] != NULL) os_printf("splt[%d]=%s\n", i, splt[i]);
}
Run Code Online (Sandbox Code Playgroud)

pokusaj:

#define pokusaj "NEKI string Koji je  Maximalno Random!  "
Run Code Online (Sandbox Code Playgroud)

我故意没有提出问题的名称

警告:赋值从整数中生成没有强制转换的指针[默认启用]

因为已经有很多.如果这是一个问题,请说出来,我会相应地进行编辑.

另外,我主要对我收到警告的原因感兴趣.关于代码的所有建议都受到赞赏(当然),但不是必需的.

PS我不会正常发布这个问题(简单的解决方案),但这让我感到很害怕,我想我错过了一些关键的东西!

usr*_*usr 7

这些类型在函数调用和函数返回的内容中都匹配.所以,我相信这个警告信息的原因是你没有提供原型或str_split()功能声明.或者,至少在你拨打电话时它不可用str_split().

因此,编译器会假定str_split()返回int(这是一个过时的约定.隐式函数声明在C中自C99起无效).

在源文件的顶部添加原型:

uint8_t** str_split(uint32_t* length, uint8_t* toSplit, uint8_t delimiter);
Run Code Online (Sandbox Code Playgroud)

或者,您可以创建头文件并将其包含在源文件中.str_split()在多个源文件中使用/调用函数时,这是首选.