2016-10-27 11 views
1

でC言語で構造体配列のメンバのサイズを得ました。 私が使用していたscanf関数は、これを行うには -は、どのように私がどのように見えるの構造を持っているランタイム

int size=0; 
struct stack{ 
    int top; 
    char string[size][80]; 
} stackV; 

をしかし、私が言う警告だこれを行うことによって - -

私がやってそれをachiveしようとした可変ファイルスコープで「文字列」を修正し

構造体の配列にサイズを割り当てる方法はありますか? 他の関数でも構造体のメンバーが使用されているため、関数内で構造体を作成することはできません。

+1

「フレキシブルアレイメンバー」を探します。 –

+0

スタックデータ構造を使用している場合は、動的メモリ割り当てを試してください。 – RoadRunner

+0

'malloc'を使うことができます。 – Swanand

答えて

-2

このコードは、私のために正しくコンパイル:

int size = 10; 

typedef struct 
{ 
    int top; 
    char string[size][80]; 
} stackv; 

私が使用している:

$ gcc --version 
gcc (Debian 5.4.1-3) 5.4.1 20161019 
Copyright (C) 2015 Free Software Foundation, Inc. 
+0

を学び始めた。これは質問に答えません。 – Lundin

2

をあなたが必要なものを達成するために柔軟な配列メンバーを使用することができます。

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

typedef struct 
{ 
    int top; 
    char string[][80]; 
} stackv; 

int main() 
{ 
    size_t strings = 3; 

    stackv* s = malloc(sizeof(stackv) + strings*80); 
    strcpy(s->string[0], "test"); 
    strcpy(s->string[1], "hello"); 
    strcpy(s->string[2], "world"); 

    for(size_t i=0; i<strings; i++) 
    { 
    puts(s->string[i]); 
    } 

    free(s); 
    return 0; 
} 

char string[][80];の宣言は、コンパイラt構造体の最後には未知の量のchar [80]配列が存在します。

したがって、sizeof(stackv)は、最後のもの(この場合は整数)を除く他のすべてのメンバーのサイズのみを与えます。

0

スタックに含まれる要素の数はわかりません。 ユーザだけがランタイムであなたに「サイズ」を与えます。配列を静的に(コンパイル時に)割り当てることはできませんが、ユーザーからサイズを取得するときには動的に(実行時に)割り当てます。 サイズ "0"から "サイズ"を定義してから、このサイズの配列を宣言しようとしているため、「警告」が表示されます。

ISO 9899:2011 6.7.6.2: 

    If the expression is a constant expression, it shall have a value greater than zero. 

"size"要素を含み、各要素が80文字の文字列である構造体として動的に配列を割り当てる方法はありますか?主な機能には

#define STR_LEN 80 
struct stack { 
    int top; 
    char *string; 
} stackv; 

enum { 
    SUCCESS = 0, 
    FAILURE, 
}; 

int InitStack(stackv *stackv, int size) { 
    if (size <= 0) 
     return FAILURE; 

    stackv->string = (char *)malloc(size*sizeof(char)*80); 
    if (stackv->string == NULL) 
     return FAILURE; 

    stackv->top = 0; 

    return SUCCESS; 
} 

、あなたは変数「stackv」を宣言し、私が書いた初期化関数への参照(ポインタ)でそれを渡します。

+0

フィールド '文字列'が解決されず、フィールド 'トップ'を解決できない警告 –

+0

ゼロサイズの配列は許可されていませんが(VLAを含む)、警告の実際の理由は静的な記憶期間を持つVLAを宣言しても意味がありません。それをやりたければ、普通の配列を使います。 – Lundin

関連する問題