*结构是非法的?

时间:2009-10-25 22:38:18

标签: c struct pointers

我尝试编译以下代码,但编译器不会这样做,因为“*对于结构体来说是非法的”是真的吗?

struct String {
    int length;
    int capacity;
    unsigned check;
    char ptr[0];
} String;

void main(){

    char *s;
    String *new_string = malloc(sizeof(String) + 10 + 1);

}

8 个答案:

答案 0 :(得分:21)

使用typedef:

typedef struct String {
    int length;
    int capacity;
    unsigned check;
    char ptr[0];
} String;    /* now String is a type */

或者明确地说struct String

void main(){
    char *s;
    struct String *new_string = malloc(sizeof(struct String) + 10 + 1);
}

答案 1 :(得分:18)

由于似乎没有人提及此问题,让我解释一下使用的代码实际意味着什么。

您使用的是一种速记符号,用于定义struct 并且创建变量。它相当于:

struct String {
    int length;
    int capacity;
    unsigned check;
    char ptr[0];
};
struct String String; //creates a global variable of type "struct String"

后来,

String *new_string

无法编译,因为没有名称为“String”的类型名称(仅限于“struct String”。有一个全局变量,其名称为“String”但在此表达式中没有意义。< / p>

答案 2 :(得分:5)

您忘记了typedef

typedef struct String {
    int length;
    int capacity;
    unsigned check;
    char ptr[0];
} String;
/* String is now a type, not an object */

void main(){

    char *s;
    String *new_string = malloc(sizeof(String) + 10 + 1);
}

答案 3 :(得分:3)

是的,这是真的。二进制*运算符(乘法)仅适用于算术类型。在您的示例中,您声明了Struct类型的变量struct Struct,然后尝试将其乘以某种东西。这没有任何意义。你不能乘以struct对象。这就是编译器告诉你的。

此外: 那是int main,而不是void main。 2. C语言不支持大小为0的数组声明。您可能希望更改结构类型中的数组声明。

答案 4 :(得分:2)

使用此代码:

struct String* new_string = malloc(sizeof(String)+10+1);

你也可以考虑typedef

typedef struct String sString;

将允许您使用您的代码段:

sString* mystring

答案 5 :(得分:2)

尝试:

 typedef struct String_t {
        int length;
        int capacity;
        unsigned check;
        char ptr[0];
    } String;

你们并没有完全宣布这样的类型。更具体地说,它通过引入同名变量来隐藏您的类型。这让编译器感到困惑......:)

答案 6 :(得分:0)

修改:我现在看到原始问题被标记为C而非C++,有人错误地将其标记为C++(还原了标记)。< / p>


正如其他人提到的,一个解决方案是在typedef声明之前添加struct,因为这是C++(根据问题的标记)而不是C一个更惯用,更简洁的方法就是删除尾随的“字符串”

struct String {
    int length;
    int capacity;
    unsigned check;
    char ptr[0];
};

这足以引入一个名为String的类型,原因是您的原始代码不起作用的原因是除了引入一个名为String的类型之外,您引入了一个名为String的变量藏了这个类型。

答案 7 :(得分:0)

正如artelius先前所写,你的结构定义可能不是你想要的。最简单的解决方法是:

#include <stdlib.h>

struct String {
    int length;
    int capacity;
    unsigned check;
    char ptr[0];
};

int main(){
    char *s;
    String *new_string = (String*)malloc(sizeof(String) + 10 + 1);
    return 0;
}

当我使用gcc和g ++进行测试时,这实际上也会编译。如果你真的在使用C ++作为你的标签暗示,你应该包括cstdlib而不是stdlib.h或者正确地做(tm)并将你的字符串变成一个类并使用new。