【问题标题】:Getting assignment without cast warning when I shouldn't?我不应该在没有演员警告的情况下获得分配?
【发布时间】:2017-03-16 13:22:17
【问题描述】:

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

所以,该函数正在完成它的工作。至少对于我所做的测试而言。

但是在编译过程中我得到了

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;
}

我这样称呼它:

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]);
}

pokusaj:

#define pokusaj "NEKI string Koji je  Maximalno Random!  "

我故意没有说出问题的名字

警告:赋值使指针从整数而不进行强制转换 [启用 默认]

因为已经有很多了。如果这是一个问题,请说,我会相应地编辑它。

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

附:我不会正常发布这个问题(简单的解决方案),但这让我非常恼火,我认为我错过了一些关键的东西!

【问题讨论】:

  • 这是一个非常复杂的split函数,你真的应该考虑重写它。
  • 还有其他警告吗?
  • @IharobAlAsimi 我知道,但没有太多时间考虑。没有其他警告。试图找到它的源代码,但找不到。我没有大多数 C 函数(在 espressif 上工作)。这可以完成工作,并且不会经常被调用,所以我想没关系。不过,只有时间会证明一切。
  • 我会检查 它是否完成了工作,而不会导致未定义的行为。你需要一个内存调试器。
  • 谢谢。忘记释放“姿势”。现在没有内存泄漏。顺便说一句,没有调试器设置(espressif 芯片),也没有时间设置它。

标签: c pointers casting compiler-warnings


【解决方案1】:

函数调用和函数返回的类型确实匹配。 所以,我认为该警告消息的原因是您没有为str_split() 函数提供原型或声明。或者,至少当您拨打str_split() 时它不可用。

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

在源文件顶部添加原型:

uint8_t** str_split(uint32_t* length, uint8_t* toSplit, uint8_t delimiter);

或者,您可以创建一个header file 并将其包含在您的源文件中。如果在多个源文件中使用/调用函数str_split(),这是首选。

【讨论】:

  • 就是这样。我忘了包括标题 S:我傻。谢谢。
  • 添加 -Werror-implicit-function-declaration 编译器选项 (GCC) 后检测此类错误更容易 - 我从不编译 C 代码...
  • 好点。我有时间会处理的。打破所有最后期限):
猜你喜欢
  • 2017-10-29
  • 2022-01-05
  • 2010-12-24
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多