2017-12-02 8 views
0

私はポインタなどの使い方を学んだことがまだ新しく、どのようにして自分が望むことができるかわからないので、誰かが私を助けてくれるのだろうかと思っていました。C - 異なるメソッドのポインタと配列

私がしようとしているのは、getArrayがポインタを使用する必要があるmain、getArray、およびprintArrayの3つのメソッドがあります。配列は2Dでなければなりません。たとえば:

void main() { 
    char *array[10]; 
    array[0] = malloc(10); 
    getArray(&array[0]); 
    printArray(array[0]); 
} 

void getArray(char *array) { 
    scanf("%s", array); //or &array? 
} 

void printArray(char array[]) { 
    printf("%s", array); 
} 

私は上記のコードを使用してみました、と私は入力として使用する場合:「」それはこの

a 
o 
-------------------------------- 
Process exited after 0.3538 seconds with return value 2 
Press any key to continue . . . 

を返された、私はまだポインタに、むしろ新たなんだ、と私は」私は本当にそれらを使用する方法を確信していません。ごめんなさい。

ありがとうございました!

+0

このコードをコンパイルするときに警告が表示されましたか? – dasblinkenlight

+3

Cでポインタと配列に関するいくつかの基礎を学ぶ必要があります。これは、すべての問題を説明することが基本的に無意味であるので、とてもうんざりしています。犯行はありません。 – klutt

+1

**警告**を有効にしてコンパイルしてください。準拠した現代のCコンパイラは、診断を発行せずにこれをコンパイルします。 –

答えて

2

getArray(&array[0]);あなたはchar**を渡しています。

あなたのプログラムでは、間違った引数scanf()を渡す未定義の動作があります。 scanf()は、割り当てられた文字ではないarrayに含まれるアドレスに読み込まれた文字を読み込もうとします。このため、未定義の動作が発生します。 scanf()にはchar*が、あなたにはchar**が渡されます。

ソリューション:それはあなたが文字列を読み込みますアドレスが含まれているような方法でもgetArray(array[0]);

arrayを渡すことは大丈夫でしょう。このすべては別に


あなたはどのあなたがすべきmallocの戻り値をチェックしませんでした。そして、そのあとの記憶はそれを使ってやってしまいます。

警告をチェックした場合、それは

note: expected ‘char *’ but argument is of type ‘char **’ 

これはあなたに何が起こっているかについての十分なアイデアを与えているはずと言います。

Jonathan Lefflerも指摘しています。関数を使用する前に宣言(または定義)します。指摘したように、タイプミスマッチエラーが発生します。これはC99以降のバージョンで必要です。 (C90はそれを許可しました - 宣言する前に関数を呼び出しました)。考えられる暗黙の宣言はint getArray()となる。

+0

関数を使用する前に宣言(または定義)します。タイプミスマッチエラーが発生します。現代Cはそれを必要とする(C99以降)。古風なC(C90)だけでは、宣言されていない関数を呼び出すことができます。 –

+0

@JonathanLeffler:編集 - gccコンパイラを使用すると、暗黙的に宣言された関数で型が不一致になっているというエラーが表示されます(2つはそれぞれ戻り型の引数用に2つです)。OPはC90を使用しています – coderredoc