Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 混合声明和代码_C_Declaration_Compiler Warnings_C89 - Fatal编程技术网

C 混合声明和代码

C 混合声明和代码,c,declaration,compiler-warnings,c89,C,Declaration,Compiler Warnings,C89,当我用“gcc-o dene-Wall-ansi-pedantic errors dene.c”编译函数时 ,gcc不会发出错误。(您能在if循环中查找以char…开头的行吗?) static void remove_否定(char*s,char*s1) { char**cmainp=malloc(sizeof(char*)*1); int len=0;int d=0;int i=0; cmainp[0]=malloc(sizeof(char)*300); len=strlen(s); 对于K&

当我用“gcc-o dene-Wall-ansi-pedantic errors dene.c”编译函数时 ,gcc不会发出错误。(您能在if循环中查找以char…开头的行吗?)

static void remove_否定(char*s,char*s1)
{
char**cmainp=malloc(sizeof(char*)*1);
int len=0;int d=0;int i=0;
cmainp[0]=malloc(sizeof(char)*300);
len=strlen(s);

对于K&R和ANSI c中的(i=0;i),必须始终将声明放在范围块的开头。c99放宽了这一要求

那么,什么是作用域块?由
{
}
分隔的区域

在你上面的例子中,声明

{
   char *p=malloc(sizeof(char)*3); /* ...
可以,因为它在
{
之后立即出现,而

{
  char **cmainp=malloc(sizeof(char*)*1);    

  /*look*/ cmainp[0]=malloc(sizeof(char)*300); /*look*/

  int len=0;...

由于分配介于
{
和第二个声明(
int len=0;
)之间,因此失败。

问题在于您的标志“-ansi”强加了ansi C的规则,其中之一是声明可能只出现在块的开头,而不会出现在与其他语句交错的任何地方


请注意,在第一个示例中,if后面的大括号
{
开始一个新块,因此在该块中声明新变量是合法的。在第二个示例中,在同一块中声明“int len”为“char**cmainp”,但在赋值为“cmainp”之后。如果您将赋值放在声明之后,那么一切都会很好,因为声明将位于块的开头。

带有“dene.c:10:error:ISO C90禁止混合声明和代码”错误,您定义的错误
char*p=malloc(sizeof(char)*3)在代码中间,ANSI C要求声明只出现在代码块的起始处,而不在其他地方。如果在代码开始时放置char <代码> *P<代码>,然后在代码10中输入代码> *p= Malc(sichOf(char)* 3)< /代码>这个“错误”。在你做任何事情之前,你必须先做声明。

我可以这样说吗;{if(s[I]='-')if(I==0 | | s[I-1]==','){char*p=malloc(sizeof(char)*3),在第二个示例中,仅当两个if语句满足时,才会创建char*p..。但是,请注意,当到达匹配的
}时,在作用域中创建的变量将超出作用域
,然后再访问它们是一个错误。C89之前的编译器更严格吗?我的意思是要求声明从每个函数块或每个块的开头开始吗?我的意思是
foo(){int I;for(i=0;i@Zboson不知道。我是在ANSI标准的编译器上学习c语言的,这些编译器对c语言最为不满。我只为grins编写过K&R,并使用了一些ANSI编译器的兼容模式。
        static void remove_negation(char *s,char *s1) 
          {
             char **cmainp=malloc(sizeof(char*)*1);    

                        int len=0;int d=0; int i=0;
             cmainp[0]=malloc(sizeof(char)*300); 
            len=strlen(s);
           for(i=0;i<len;++i)
             { if(s[i]=='-')
        /*look*/   char *p=malloc(sizeof(char)*3);   /*look*/
               if(i==0 || s[i-1]==',')
              {

                ++i;    p[0]=s[i];   p[1]='\0'; 

              strcat(s1,","); strcat(s1,p); free(p);
               continue;
             }
            cmainp[0][d]=s[i]; 
               ++d;
               } cmainp[0][d+1]='\0'; 


             strcpy(cmainp[0],s);
             free(cmainp[0]);
              }
{
   char *p=malloc(sizeof(char)*3); /* ...
{
  char **cmainp=malloc(sizeof(char*)*1);    

  /*look*/ cmainp[0]=malloc(sizeof(char)*300); /*look*/

  int len=0;...