3

次のコードは、互換性のないポインター型のエラーと警告を生成します。制御がファイル名関数の非 void 関数の終わりに到達します。

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

int quit;
char *filename(int *);

int main ()
{   
    filename(&quit);   
    return 0;
}

char *filename(int *i1)
{
    char input[16];
    char *dum=(char*)malloc(16*sizeof(char));    
    if (dum==NULL){
        printf("Memory could not be allocated \n");
    }
    else {
        printf("Memory was allocated – remember to free\n \n");    
        *i1=1;    
        fputs("Input filename = ", stdout);
        fflush(stdout);
        fgets(input,sizeof(input),stdin);    
        printf("Filename = \"%s\"\n",input);   
        return i1;

    }
}

私はこれに慣れていません。誰かがこのエラーを手伝ってくれますか?

4

3 に答える 3

3

はい、そうです?関数は を返すようchar *に宣言されていますi1が、これは入力引数で型がint *です。

新しく割り当てられた文字列を返し、別の文字配列dumを使用して読み取られたデータで埋めることを意味する場合があります。この場合、データをコピーして戻す必要があります。fgets()inputdum

に直接読み込む方が、より簡潔でシンプルで、一般的には優れていますdum

fgets(dum, 16, stdin);

return dum;

malloc()これは、「コードのにおい」である呼び出しからのバッファーのサイズを複製することに注意してください。これは、関数内のローカル定数にすることで改善できます。

char * filename(void)
{
  const size_t max_fn = 16;
  char *dum;

  if((dum = malloc(max_fn)) != NULL)
  {
    if(fgets(dum, max_fn, stdin) != dum)
    {
      free(dum);  /* Input failed, free the buffer and drop the pointer. */
      dum = NULL;
    }
  }
  return dum;
}

後者のコードには、失敗する可能性のある関数の戻り値をチェックするという利点もあります。メモリ割り当て ( malloc()) と I/O ( fgets()) の両方が失敗する可能性があるため、戻り値を確認する必要があります。

于 2012-10-18T06:53:04.417 に答える
1

さて、まず、あなたのインデントはぞっとします。これを再インデントすると、何が起こっているのかが少し明確になります。

char *filename(int *i1)
{
    char input[16];
    char *dum=(char*)malloc(16*sizeof(char));

    if (dum==NULL){
        printf("Memory could not be allocated \n");
    }
    else {
        printf("Memory was allocated – remember to free\n \n");

        *i1=1;

        fputs("Input filename = ", stdout);
        fflush(stdout);
        fgets(input,sizeof(input),stdin);

        printf("Filename = \"%s\"\n",input);

        return i1;

    }
}

したがって、ifの1つのパスで、intポインターである'i1'を返します。これは、最も確実にcharポインターではありません。

残りの半分では、関数の最後にドロップスルーするだけで、何も返されません。

幸運なことに、コンパイラがこれについて警告します。多くの場合、デフォルトでは、それを無視します。

余談ですが、メモリリークがあります。あなたはダムのためにメモリをmallocしますが、決してそれを解放しません。

于 2012-10-18T06:57:50.637 に答える
1

アンワインドが言ったことに加えて、行の後に何かを返す必要がありますprintf("Memory could not be allocated \n");

于 2012-10-18T06:55:40.637 に答える