1
 int test_malloc(void **ptr, size_t size)
 {
    (*ptr) = malloc(size);
    return 0;
 }

 int test_app()
 {
   char *data = NULL;
   int ret = 0;
   ret = test_malloc((void **)&data, 100);
 }

コンパイラ:gcc 4.1.2

とりわけ、私は-O2と-Wallを使用しています。これらは、これをチェックするいくつかのオプションをオンにしていると思います。

4

3 に答える 3

3

type の変数がありchar*test_mallocそれを type の左辺値で変更しているため、void *厳密なエイリアシング ルールが破られています。

次のように解決できます。

 int test_app()
 {
   char *data = NULL;
   void *void_data = NULL;
   int ret = 0;
   ret = test_malloc(&void_data, 100);
   data = (char*)void_data;
 }

void*しかし、このような問題を回避するために、test_malloc を返すようにすることをお勧めします。

于 2012-05-10T06:11:48.407 に答える
2

C でやろうとしていることはできません。無効なコードです。を使用してジェネリック ポインターを返したい場合void *、これを行う唯一の方法は戻り値です。これはvoid *、任意のポインター型に変換されvoid *、任意のポインター型が に変換されますが、他の型のポインターへのポインターに変換されず、他のポインター型へのポインターが に変換されないためvoid ** ですvoid **

于 2012-05-10T06:12:05.267 に答える
1

私はこれがうまくいくように試します

void * test_malloc(int size)
{
    void *mem = malloc(size);
    if (mem == NULL)
    {
        printf("ERROR: test_malloc %d\n", size);
    }
    return mem;
}

 int test_app()
 {
   char *data;
   int ret = 0;
   data = test_malloc(100);

   if(data != NULL)
         free(data);
 }
于 2012-05-10T06:09:38.670 に答える