2016-12-08 3 views
1

問題は構造体に関数を介して値を追加することに関係します。正直なところ、私は問題を解決できませんでした(多くの時間を費やしていました)ので、私はあなたの助けを求めています。プログラムを実行している間、私はsegmentation faultを得ます。これは、stack stosの変数を使用しているときに発生します。構造体に値を参照して値を追加する際のセグメンテーションエラー

typedef struct e { 
    int zaglebienie[100]; 
    char *nazwa_funkcji[100]; 
    int poz; 
} *stack; 

void put_on_fun_stack(int par_level, char *funame, stack stos) { 
    int i = stos->poz; 
    stos->zaglebienie[i] = par_level; 
    char *funkcja = strdup(funame); 
    stos->nazwa_funkcji[i] = funkcja; 
    stos->poz++; 
} 

int main() { 
    char *p = "makro"; 
    stack stos; 
    stos->zaglebienie[0] = 0; 
    put_on_fun_stack(1, p, stos); 
    return 0; 
} 
+2

'poz'初期化されていない。 –

+1

**決して* typedefポインタはありません!遅かれ早かれ、あなたは結局問題に遭遇します。あなたの場合、それはより早かった。 – Olaf

+0

上記への翻訳: 'stos'は割り当てられていないポインタです。はい、typedefedポインタは私も混乱しています。 –

答えて

1

あなたはstackへのポインタを宣言しているが、あなたがそれに任意のメモリを割り当てていません。

コメントで既に述べたように、typedefをポインタで使用すると、人生を不必要に複雑にします。

だから私は多少このように、あなたがメインの宣言に続いstackへのポインタをstruct stackを作成し、提案し、そのためのメモリを割り当てる:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

typedef struct e { 

    int zaglebienie[100]; 
    char *nazwa_funkcji[100]; 
    int poz; 

} stack; 


void put_on_fun_stack(int par_level, char *funame, stack *stos) 
{ 
    int i = stos->poz; 
    stos->zaglebienie[i] = par_level; 
    char *funkcja = strdup(funame); 
    stos->nazwa_funkcji[i] = funkcja; 
    stos->poz++; 
} 

int main(void) 
{ 
    char *p = "makro"; 

    // calloc to initialize stos variables to 0 
    stack *stos = calloc(sizeof(stack), 1); 

    printf("stos->poz before: %d\n", stos->poz); 
    put_on_fun_stack(1, p, stos); 
    printf("stos->poz after: %d\n", stos->poz); 
    printf("stos->nazwa_funkcji[0]: %s\n", stos->nazwa_funkcji[0]); 


    free(stos->nazwa_funkcji[0]); 
    free(stos); 
    return 0; 
} 

出力:

stos->poz before: 0 
stos->poz after: 1 
stos->nazwa_funkcji[0]: makro 
+0

Dev-C++またはInitializer要素の[void *]から[stack * {aka e *} '[-fpermissive]への無効な変換はありません。 VIMの定数 – chrislacorunna

+0

私はCで答えました(あなたの質問のCタグのため)。 C++では、 'malloc'&coの戻り値をあなたが望む型に明示的にキャストする必要があります。 – yLaguardia

+0

私はVim(gcc/ccコマンド)からDevとCコンパイラのC++コンパイラを使用しました。 – chrislacorunna

関連する問題