8
  1 #include<stdio.h>
  2 #include<malloc.h>
  3 
  4 typedef struct node_t{
  5     int i;
  6     struct node_t* link;
  7 }node;
  8 
  9 node* head = (node *)malloc(sizeof(node));
 10 
 11 if(head == NULL){
 12     printf("\n malloc for head node failed! \n");
 13 }
 14 
 15 int main(){
 16     int i = 10;
 17     node* temp = NULL;
 18     temp = (node *)malloc(sizeof(node));
 19     if(temp == NULL){
 20         printf("\n malloc for temp node failed! \n");
 21     }
 22     else{
 23         while(i<=10){
 24             ;
 25         }
 26     }
 27     return 0;
 28 } 

コンパイルエラー:

linked.c:9:1: error: initializer element is not constant
linked.c:11:1: error: expected identifier or ‘(’ before ‘if’

単純なリンクリストプログラムを試しています。完全には完成していません。コンパイルエラーが発生します。なぜこれが起こったのか理解できませんでした。

4

4 に答える 4

13

グローバルとして定義headしているので、その初期化子は定数である必要があります。基本的に、コンパイラー/リンカーは、実行可能ファイルでそのスペースを割り当て、そのスペースに初期化子を書き込んで、完了する必要があります。malloc初期化中に上記で行ったように呼び出すためのプロビジョニングはありません。内部main(またはから呼び出すものmain)で呼び出す必要があります。

#include <stdlib.h>

void init() { 
    head = malloc(sizeof(node));
}

int main() { 
    init();
    // ...
}

この場合、使用しているコードがmain実際に使用さheadれることはないため、上記のすべてを問題なくスキップできる可能性があります。

于 2012-11-29T07:21:15.240 に答える
12
 9  node* head = (node *)malloc(sizeof(node));
 10 
 11 if(head == NULL){
 12     printf("\n malloc for head node failed! \n");
 13 }

main()関数呼び出しまたは実行可能ファイルはmain()関数内またはmainから呼び出される関数内にある必要があるため、これらの行は外部では使用できません。

にとってlinked.c:9:1: error: initializer element is not constant

関数定義またはグローバル初期化のみが外部で可能ですが、初期化子は定数式`main()である必要があります。

をグローバルとして宣言できますがhead、初期化が間違っています。

このようにしてください:

node * head =NULL // here initialization using constant expression


void function () // any function 
{
 head = malloc(sizeof(node));
}

の場合linked.c:11:1: error: expected identifier

ifステートメントを関数の外に置くことはできません。あなたの場合、これらの行をメインの中に入れて問題を解決してください

于 2012-11-29T07:21:00.137 に答える
3

headグローバルバリバールです。グローバル変数と静的変数は、定数式、つまりリテラルによって初期化する必要があります。だからあなたはできません

node* head = (node *)malloc(sizeof(node));
于 2012-11-29T07:20:33.273 に答える
0

グローバルスコープでmalloc()を使用することはできません。またはあなたはフォローのようにすることができます

#include<stdio.h>
#include<malloc.h>
  :
node* head
  :
  :
int main(){
  :
  :
head = (node *)malloc(sizeof(node));
  :
  :
}
于 2012-11-29T07:37:56.347 に答える