コマンドラインから整数の配列に読み込む際に問題があります。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を渡します。
実行時にこのプログラムが動作し、キャストまたは参照解除時に追加しようとすると警告が抑制されますが、実行時にプログラムがクラッシュするという問題があります。
'int * nums []'はintへのポインタの配列であり、intの配列ではありません。 – tkausl
一般的なルールとして、* "代入はキャストなしの整数からポインタを作る"という警告が表示されたときは、コンパイラによって識別された行のインダイレクション*のレベルに問題があることを意味します。警告は実際には非常に良いです。あなたの左辺値として*ポインタ*を使用している間に*整数*を代入しようとしていることを伝えます。例えば'int a = 6; int * b = a; 'bがポインタとして宣言され、左辺値として使用されている場合、' a'が '* 'で* integer *で' b'が*ポインタ* 。これを修正するには、 'b =&a;'が必要で、 'b 'に* aのアドレスを割り当てます。 –