0

私はC言語の初心者で、よく理解できないのはmallocの使い方です。そこで、この例を作成することにしました。バッファ データが出力されない理由と、これを行うためのベスト プラクティスは何かを理解したいと思います。

#include <stdio.h>      /* printf, scanf, NULL */
#include <stdlib.h>     /* malloc, free, rand */

void f(char * buffer, int i) {
  buffer = (char *) malloc(i+1);
  if (buffer==NULL) 
    exit (1);

  for (int n=0; n<i; n++)
    buffer[n]=rand()%26+'a';

  buffer[i]='\0';
}

int main ()
{
  char * buffer;
  f(buffer, 5);
  printf ("Random string: %s\n",buffer);
  free (buffer);

  return 0;
}

ありがとう

4

5 に答える 5

4

あなたbuffer = (char *) malloc(i+1);は関数の外では何の効果もありません。実際には、関数は の独自のコピーを変更してbufferおり、呼び出し元 ( main) はこの変更を認識しません。これはすべてC FAQでよく説明されています。

関数は現時点では何も返さないため、パラメーターとして渡す代わりに、バッファーを返すことができます。

char *f(int i)
    /* ... */
    return buffer;

/* ... */

char * buffer = f(5); 

  • C ではキャスティングmallocは不必要であり、疑わしい慣行と見なされることがよくあります
  • n変数名とi変数名はやや誤解を招く可能性があります。
  • f関数の適切な名前ではありません
于 2013-03-28T15:13:22.373 に答える
2

関数に渡されたポインターを変更するには、ポインターからポインターを使用する必要があります。

void f(char** buffer, int i) {
  *buffer = malloc(i+1);
  if (*buffer==NULL) 
    exit (1);

  for (int n=0; n<i; n++)
    (*buffer)[n]=rand()%26+'a';

  (*buffer)[i]='\0';
}

使用法:

char* buff;

f(&buff, len);
于 2013-03-28T15:15:31.113 に答える
1

変数は値によって関数に渡されます

を呼び出すと、変数が関数にf(buffer, 5)渡されません。変数の値をコピーするだけです。functionでは、 (パラメーター変数)という名前の新しい変数が作成されます。その変数の値を変更しても、渡した元の変数は影響を受けません。bufferfbufferfbuffermain

これを解決するさまざまな方法:

ポインターをf返して、に保存しbufferますmain

char * f(int i) {
    char * buffer = malloc(i + 1);

    /* ... */

    return buffer;
}

int main() {
    char * buffer = f(5);

    /* ... */

    return 0;
}

または、へのポインターへのポインターを渡しますf。でmain、次のアドレスを渡しますbuffer

void f(char ** buffer, int i) {
    *buffer = malloc(i + 1);

    /* ... */
}

int main() {
    char * buffer;
    f(&buffer, 5);

    /* ... */

    return 0;
}        
于 2013-03-28T15:18:16.937 に答える
0

値渡しされた変数の元の値を変更することはできません。

関数で malloc し、変数で malloc の結果を返す場合、その変数は pass -by-referenceである必要があります。

たとえば、次の代わりに:

void f(char * buffer, int i);

そのはず:

void f(char **buffer, int i);
于 2013-03-28T15:19:07.480 に答える
0

CNICUTAR は正しいですが、ここに興味深い情報があります。

マロック :

malloc をキャストしないでください (これに関する興味深いトピックがあります: Do I cast the result of malloc? )。

ループの場合:

for ループの場合、この方法を使用する必要があります (C89 バージョン):

int i;
for (i = 0; ...)

よろしく、

于 2013-03-28T15:19:26.483 に答える