1

次のコードは受け入れられますか。つまり、これは malloc を行う正しい方法ですか?

これは、私の状況で動作するようになる最小限のコードです。それは「正しい方法」だと思いますが、私はCが初めてで、全体的な手がかりがあまりありません。関連するSOの投稿をいくつか読みましたが、この状況と完全に一致するものはないようです。コメント?

#include <stdio.h>

// example of calling a function that creates a dynamically sized array and
// returns it to a caller that doesn't know or care about the size of the array

char* return_char_array(){
     // for the sake of the example, we determined the size to be 100
     char *f=malloc(100*sizeof(char));
     // stick something in the first couple of elements for test purposes
     *f=65;
     *(f+1)=66;
     return f;
}

int main(){
    // we want this function to remain ignorant of the size or other workings 
    // of the array, so, no '[]' or 'malloc'
    char *wipc = return_char_array();
    // well i guess it cares a little, because we assume there are at least 2 elements...
    printf("%c,%c\n",*(wipc),*(wipc+1));
    system("PAUSE");
    return 0;
}
4

7 に答える 7

4

コメント?

f[0]の代わりに*fとのf[1]代わりに使用し*(f + 1)ます。についても同様ですwipc。電話することを忘れないでくださいfree

于 2012-07-04T14:33:06.207 に答える
1

この状況でも大丈夫だと思います。ただし、割り当てられたメモリを解放することを忘れないでください:)

于 2012-07-04T14:35:49.983 に答える
0

一見したところ、私はあなたがあなたのマロックされたスペースを解放しないことを認めます、それは悪いです(メモリリーク)。それが私が見ることができる唯一の本当の「欠陥」です。ただし、コードレビューの形式でより多くの洞察が必要な場合は、Stackexchangeサイトの「コードレビュー」に投稿してください。このサイトは実際の問題やエラーを解決するためのものです。

于 2012-07-04T14:36:14.700 に答える
0

まあ、それは本当に最小限のコードです。余分なマークバイトをバッファの最後に置き、malloc のときに余分な 2 バイトをバッファの長さに追加することを忘れないでください。

これらの 2 バイトは内部使用のために予約されており、ユーザーに公開しないでください。

于 2012-07-04T14:37:57.923 に答える
0

関数が使用している配列のサイズを知らないことは、関数にとって何の利点もありません。コメントには説明が必要です。

于 2012-07-04T14:33:13.347 に答える
0

いいえ、これは悪い考えであり、あまり意味がありません。メモリを割り当てているコードは、メモリを解放する必要があります。そうしないと、メモリ リークが発生する可能性が高くなります。

通常、次のようなアルゴリズムを記述します。

// caller.c

#include "stuff.h"  // the code uses the code module "stuff"

void caller (void)
{
  int* array = malloc(N * sizeof(int));

  do_stuff(array, N);

  free(array);
}

_

// stuff.h

void do_stuff (int* array, int size);

_

// stuff.c

#include "stuff.h"

void do_stuff (int* array, int size)
{
  ...
}

このプログラム設計では、「do_stuff()」はメモリ割り当てを気にする必要はなく、アルゴリズムを実行するだけです。また、割り当てと解放が同じ場所から行われるため、メモリ リークを心配する必要もありません。

また、この設計では、do_stuff() は、静的に割り当てられたメモリ (単純な配列) でも同様に機能します。

この設計は C ではほぼ標準です。一例として、Windows API 全体でこの設計が使用されています。

于 2012-07-04T14:43:13.437 に答える
0

いくつかのコメント、

1)Pl. 適切なエラー処理を行います。malloc が失敗するとどうなりますか?

char *f=malloc(100*sizeof(char))
if (NULL == f)
{   
   //Take actions ..Exit with error or return NULL..
}

2)Pl。100 のようなハードコーディングされた値は避けてください (#define MAX 100 がある場合があります)

3)Pl。メモリを適切に解放してください。

于 2012-07-04T14:50:36.797 に答える