2016-09-02 4 views
-2

コマンドラインから整数の配列に読み込む際に問題があります。C - コマンドラインからの読み込みで問題が発生しました - キャストのない整数からポインタを代入します

意図は、入力された行をスペース/タブで解析し、次に個々の数字を適切な配列スロットにatoi()することです。

関連コード:

main.cの

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

#include "functions.h" 

int main() 
{ 
    int nums[100]; 
    int count = 0; 

    readInput(&nums, &count); 

    return 0; 
} 

functions.h

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

#ifndef FUNCTIONS_H_INCLUDED 
#define FUNCTIONS_H_INCLUDED 

void readInput(int *nums[], int *count); 

#endif // FUNCTIONS_H_INCLUDED 

functions.c

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

#include "functions.h" 

#define delims " \t\r\n" 

#define MAX_LEN 128 

void readInput(int *nums[], int *count) 
{ 

    char *input = malloc(MAX_LEN); 
    char *buffer; 

    gets(input); 

    buffer = strtok(input, delims); 

    nums[(*count)++] = atoi(buffer); 

    while ((buffer = strtok(NULL, delims)) != NULL) 
     nums[(*count)++] = atoi(buffer); 

    buffer = strtok(NULL, delims); 
} 

の行は、とnums [(* count)++] = atoi(buffer)です。は、警告:で警告しています。警告:割り当てによって、キャストのない整数からポインタが作成されます。

そしてmain.cの、ラインreadInput(& NUMS、&数)から。でフラグを立てています "警告:互換性のないポインタ型" "から 'readInput'の引き数1を渡します。

実行時にこのプログラムが動作し、キャストまたは参照解除時に追加しようとすると警告が抑制されますが、実行時にプログラムがクラッシュするという問題があります。

+5

'int * nums []'はintへのポインタの配列であり、intの配列ではありません。 – tkausl

+0

一般的なルールとして、* "代入はキャストなしの整数からポインタを作る"という警告が表示されたときは、コンパイラによって識別された行のインダイレクション*のレベルに問題があることを意味します。警告は実際には非常に良いです。あなたの左辺値として*ポインタ*を使用している間に*整数*を代入しようとしていることを伝えます。例えば'int a = 6; int * b = a; 'bがポインタとして宣言され、左辺値として使用されている場合、' a'が '* 'で* integer *で' b'が*ポインタ* 。これを修正するには、 'b =&a;'が必要で、 'b 'に* aのアドレスを割り当てます。 –

答えて

1

あなたはあなたの関数を宣言する場合:

void readInput(int *nums[], int *count); 

を引数宣言int *nums[]はポインタの配列ではなく、あなたが&numsと同じようにそれを呼んで配列へのポインタです。

ただし、にはが必要です。ここでは配列へのポインタを渡しません。配列は、最初の要素へのポインタに自然に減衰します。また、関数の引数として配列を宣言すると(上の関数プロトタイプのnumsの宣言のように)、実際にはポインタになります。

関数の引数を宣言するとき、int nums[]のような宣言はint *numsと同じです。

のでreadInputの宣言は本当に

void readInput(int *nums, int *count); 

あなたは(当然の関数定義を含む)その変更を行い、そして

readInput(nums, &count); 

のようにそれを呼び出す場合は、すべてがうまく出て動作するはずであるべき。

+0

これは動作します。どうもありがとう。通常はJavaのプログラマーです。このバプテスマでは多くの楽しみがあります。 – TheNotoriousWMB

関連する問題