为什么这些变量显然会改变类型?

时间:2011-01-02 20:58:46

标签: c types typedef

Python破坏了我,并试图将我的思想包裹在C现在正是一场愚蠢错误的大屠杀。这是我无法理解的。

我希望C等价于Python的os.path.split,但没有确切的等价物。 strsep看起来很相似,但需要一些按摩才能使用。

首先,我定义了我的路径类型:给定长度的字符串。

#define MAX_PATH_LEN 200 /* sigh */
typedef char t_path[MAX_PATH_LEN];

然后我写了一些代码来做实际的按摩,试图避免副作用 - 只是为了让事情变得简单。

typedef struct {
    t_path next;
    t_path remainder;
} t_path_next

t_path_next path_walk_into(t_path path) {
    t_path_next output;

    t_path my_next, my_remainder = "/";
    strncpy(my_next, path, MAX_PATH_LEN);

    strsep(&my_next, my_remainder);

    output.remainder = my_remainder;
    output.next = my_next;
    return output;
}
然而,gcc并没有留下深刻的印象。

badp@delta:~/blah$ gcc path.c -Wall
path.c: In function ‘path_walk_into’:
path.c:39: warning: passing argument 1 of ‘strsep’ from incompatible pointer type
/usr/include/string.h:559: note: expected ‘char ** __restrict__’ but argument is of type ‘char (*)[200]’
path.c:41: error: incompatible types when assigning to type ‘t_path’ from type ‘char *’
path.c:42: error: incompatible types when assigning to type ‘t_path’ from type ‘char *’

我对这张纸条感到困惑 - char **char (*)[200]如何真正不同 - 但错误甚至更奇怪。我想在t_path类型的字段中分配一个我声明为t_path的变量,但我没有。

为什么?


对于任何感兴趣的人来说,这是函数的正确工作版本:

t_path_next path_walk_into(t_path path) {
    t_path_next output;
    t_path my_path, delim = "/";
    char* my_path_ptr = my_path;    
    strncpy(my_path, path, MAX_PATH_LEN);

    strsep(&my_path_ptr, delim); //put a \0 on next slash and advance pointer there.

    if (my_path_ptr == NULL) //no more slashes.
        output.remainder[0] = 0;
    else
        strncpy(output.remainder, my_path_ptr, MAX_PATH_LEN);
    strncpy(output.next, my_path, MAX_PATH_LEN);

    return output;
}

2 个答案:

答案 0 :(得分:4)

错误:您不能直接在C中分配数组,例如字符串。您需要通过char复制char,或者调用str(n)cpy,它会为您完成。

答案 1 :(得分:3)

  • 对于警告:您可能已经意识到数组可能会衰减到指针。也就是说,例如,是什么使得数组可以作为预期指针的函数的参数。在你的情况下,你拥有的是一个指向数组的指针:没有理由将这样的东西转换为指向指针的指针。

    为了记录,C99标准说(6.3.2.1/3):

      

    除非是sizeof运算符或一元&运算符的操作数。运营商,或者是   用于初始化数组的字符串文字,具有类型''数组类型'的表达式   转换为类型为''指向类型'的指针的表达式,指向的初始元素   数组对象并不是左值。

    你在一元&的背景下:不为你转换。

  • 对于错误:它已经被回答,但是不能直接进行数组赋值。您可能希望使用strcpystrncpy