2017-02-19 27 views
0

私はあなたの助けが必要です! char文字列に格納されているデータのC構造体でが動作するのは、char *name;の1種類の宣言のみですが、char []name;は機能しません。構造体Cの文字列

しかし、構造体を使用せずにコード内で文字列を宣言しようとすると、はすべてで動作します。コード例では、どのようなときにchar配列を宣言するか、両方の宣言型が機能します。

#include "funct.h" 
#include "stdio.h" 

//structure employee name and surname only works when using char* pointers 

struct employee { 
    char *name; 
    char *surname; 
}; 

int main() { 
    struct employee worker; 
    worker.name = "Robert"; 
    worker.surname = "Woz"; 

    printf("\n"); 
    printf("%s", worker.name); 
    printf("\n"); 
    printf("%s", worker.surname); 
    printf("\n"); 

    char name[] = "Robert"; //declaration of array with using [] postfix 

    for (int i = 0; i < 7; i++) { 
     printf("%c", name[i]); 
    } 

    printf("\n"); 

    char *surname = "Woz"; //declaration of array wit using char* pointer 

    for (int i = 0; i < 4; i++) { 
     printf("%c", surname[i]); 
    } 

    printf("\n"); 

    return (0); 
} 

プログラムの出力:すべての

Robert 
Woz 
Robert 
Woz 
+0

CまたはC++? 1つを選択します。 –

+0

'char * surname'は配列を宣言しません。ポインタを宣言します。 – melpomene

+0

'char * surname =" Woz ";'静的寿命の文字列リテラルを作成し、それを指すために 'surname'を割り当てます。 '' char name [] = "Robert"; 'スコープされた有効期間の文字配列を作成し、配列はポインタ_と同じではないので、配列にはいくつかの余分な情報があります。それが指している多くの記憶。 – George

答えて

2

まず、標準ライブラリヘッダをインクルードする<header.h>の代わり"header.h"を使用しています。引用符を使用すると、コンパイラはファイルディレクトリのヘッダを見つけようとします。 <>を使用すると、コンパイラはインクルードディレクトリのヘッダーを探します。

第2に、角括弧を使用する宣言では、char []name;ではなく、char name[];のみを受け入れます。しかし、構造体でこのように宣言した場合は、char name[30];のようにサイズを指定する必要があります。単一の変数を宣言して文字列リテラルで初期化するときは、サイズなしでしか宣言できないため、コンパイラは文字列リテラルからサイズを推定します。例:char name[] = "Robert";

第3に、char* nameの宣言がchar name[30]であることの違いは、メモリ内のcharのシーケンスへのポインタを宣言することです。第2の方法では、固定サイズの配列を宣言します。 charポインタを代入すると、サイズの文字列リテラルにアサインすることができますが、初期化後に小さな文字列リテラル(またはそれ以上)に固定サイズの配列を代入するとエラーが発生する可能性があるので注意してください。

+0

しかし、このように宣言された配列の大きさ 'char * name'は静的であるか、' realloc(); '関数を使って再宣言できますか? –

+0

'char * name'は配列をまったく定義しませんが、***が***を指すことができるポインタを' char'に指定します。***は***が***配列の最初の要素であり、 ***もしあなたがそれを指摘したら***。 – alk

+0

何でも 'realloc'を使うためには、まず' malloc'や 'calloc'を使い、' malloc'の戻り値を代入する必要があります。そして、あなたが 'malloc'に割り当てた変数を使った後、' free'を使う必要があります。 'malloc'ファミリで動的メモリ割り当てを使うつもりなら、' char * 'を使います。変数を異なるサイズの文字列リテラルに再割り当てする場合は、 'char *'も使用する必要があります。 –

0

structにchar name[]を使用すると、コンパイラはcharタブのサイズを認識しません。 そのため、構造体型でポインタを使用する必要があります。または、

char name[MAX_SIZE];を使用することができます。

しかし、私はポインタを使用してrecommand :)

+0

しかし、文字列のために予約されたメモリがあるときには、それは唯一の変数、そのメモリアドレス、vs worker.surname格納された配列、ある量のchar要素を持つポインタですか?今のところ: 'worker.surname =" Woz ";'? –

+0

配列名は、最初の配列要素のアドレスを格納するポインタかどうかを指定します。 –

0

あなたの質問によると。

  1. ヘッダーファイルの引用符。 < >の代わりに" "
  2. 私はそう考えていませんが、CはJavaのように宣言する配列を許可します。 char name[] = " ";の代わりにchar []name=" ";

    ​​は単なるポインタです。