我尝试编译以下代码,但编译器不会这样做,因为“*对于结构体来说是非法的”是真的吗?
struct String {
int length;
int capacity;
unsigned check;
char ptr[0];
} String;
void main(){
char *s;
String *new_string = malloc(sizeof(String) + 10 + 1);
}
答案 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。