C语言c2036错误,error C2036:'void *' : unknown size void*和void**的区别
时间: 2023-08-20 20:08:01 浏览: 79
`*`表示指向未知类型的指针,因此它可以指向任何类型的数据。它的大小在编译时是已知的。
`void**`表示指向 void* 类型指针的指针,或者说是指向指针的指针。它本身也是一个指针,指向另一个指针,因此它的大小是已知的。在使用`void**`时需要注意,因为它需要指向一个指针,所以必须先分配一个指针,再将该指针的地址传递给`void**`。
相关问题
c语言如何将错误信息存入字符串
在C语言中,可以使用标准库中的函数来将错误信息存入字符串。一个常用的函数是`sprintf`,它可以将格式化的字符串写入到字符数组中。
下面是一个简单的示例代码,演示了如何将错误信息存入字符串:
```c
#include <stdio.h>
void handleError(int errorCode, char* errorString) {
switch (errorCode) {
case 1:
sprintf(errorString, "Error code 1: File not found");
break;
case 2:
sprintf(errorString, "Error code 2: Invalid input");
break;
// 在这里可以添加更多的错误代码和对应的错误信息
default:
sprintf(errorString, "Unknown error");
break;
}
}
int main() {
int errorCode = 1;
char errorString[100];
handleError(errorCode, errorString);
printf("Error: %s\n", errorString);
return 0;
}
```
在上面的示例中,`handleError`函数根据传入的`errorCode`参数,使用`sprintf`函数将对应的错误信息存入`errorString`字符串。然后在主函数中,通过`printf`函数将错误信息打印出来。
注意,在使用`sprintf`时,需要确保目标字符串具有足够的空间来存储格式化后的字符串,以避免发生缓冲区溢出。在上面的示例中,我们定义了一个长度为100的字符数组作为目标字符串。
使用lex和yacc编写一个C语言的语法分析器
1. 创建lex文件,命名为c_lex.l,输入以下内容:
%{
#include "c_yacc.tab.h"
%}
%%
"int" { return INT; }
"float" { return FLOAT; }
"char" { return CHAR; }
"if" { return IF; }
"else" { return ELSE; }
"while" { return WHILE; }
"for" { return FOR; }
"return" { return RETURN; }
[0-9]+ { yylval.num = atoi(yytext); return NUM; }
[a-zA-Z_][a-zA-Z0-9_]* { yylval.id = strdup(yytext); return ID; }
";" { return SEMICOLON; }
"," { return COMMA; }
"(" { return LEFTPAREN; }
")" { return RIGHTPAREN; }
"{" { return LEFTBRACE; }
"}" { return RIGHTBRACE; }
"==" { return EQ; }
">" { return GT; }
">=" { return GE; }
"<" { return LT; }
"<=" { return LE; }
"!=" { return NE; }
"=" { return ASSIGN; }
"//" { while(yyinput() != '\n'); }
"/*" { while(yyinput() != '*' || yyinput() != '/') yyinput(); }
[ \t\n] { }
. { printf("Error: unknown character %c\n", *yytext); }
%%
int yyinput(void)
{
return fgetc(yyin);
}
2. 创建yacc文件,命名为c_yacc.y,输入以下内容:
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int yylex();
void yyerror(char *error);
int yyparse();
extern FILE *yyin;
extern int yylineno;
extern char *yytext;
%}
%token INT FLOAT CHAR IF ELSE WHILE FOR RETURN
%token NUM ID
%token SEMICOLON COMMA LEFTPAREN RIGHTPAREN LEFTBRACE RIGHTBRACE
%token EQ GT GE LT LE NE ASSIGN
%start program
%%
program: statement
;
statement: declaration
| assignment
| if_statement
| while_statement
| for_statement
| return_statement
| SEMICOLON
;
declaration: type ID SEMICOLON
;
assignment: ID ASSIGN expression SEMICOLON
;
if_statement: IF LEFTPAREN expression RIGHTPAREN LEFTBRACE statement RIGHTBRACE
| IF LEFTPAREN expression RIGHTPAREN LEFTBRACE statement RIGHTBRACE ELSE LEFTBRACE statement RIGHTBRACE
;
while_statement: WHILE LEFTPAREN expression RIGHTPAREN LEFTBRACE statement RIGHTBRACE
;
for_statement: FOR LEFTPAREN expression SEMICOLON expression SEMICOLON expression RIGHTPAREN LEFTBRACE statement RIGHTBRACE
;
return_statement: RETURN expression SEMICOLON
;
type: INT
| FLOAT
| CHAR
;
expression: expression EQ expression
| expression GT expression
| expression GE expression
| expression LT expression
| expression LE expression
| expression NE expression
| expression '+' expression
| expression '-' expression
| expression '*' expression
| expression '/' expression
| LEFTPAREN expression RIGHTPAREN
| ID
| NUM
;
%%
void yyerror(char *error)
{
printf("Error: %s at line %d\n", error, yylineno);
}
int main(int argc, char *argv[])
{
if(argc < 2)
{
printf("Usage: %s <filename>\n", argv[0]);
return 1;
}
FILE *fp = fopen(argv[1], "r");
if(!fp)
{
printf("Error: cannot open file %s\n", argv[1]);
return 1;
}
yyin = fp;
yyparse();
fclose(fp);
return 0;
}
3. 编译生成可执行文件,输入以下命令:
lex c_lex.l
yacc -d c_yacc.y
gcc lex.yy.c y.tab.c -o c_parser
4. 执行可执行文件,并输入要分析的C语言代码文件名,例如:
./c_parser test.c
其中test.c为要分析的C语言代码文件。