C - 指针的正确语法

C - proper syntax for pointer

我调用一个函数全局变量如下:

char    *Pointer;

然后我将它传递给函数:

char *MyChar = DoSomething (&Pointer);

定义为:

char *DoSomething (char *Destination)
{
   free (*Destination);

   //re-allocate memory
   Destination = malloc (some number);

   //then do something...       

   //finally
   return Destination;
}

它仅在我使用 (*Destination) 而不是 (Destination) 时有效。有人可以告诉我这是否正确吗?我仍然不明白为什么它不带 (Destination)。

是对的,Destination已经声明为指针了,所以你把Destination的地址传给DoSomething(&Destination),就是指针指向指针,那么你需要在 DoSomething() 函数中取消引用 Destination,间接运算符 * 对其起作用。

但正确的方法,不是传递指针的地址,而是传递指针,如

DoSomething(Destination);

现在,既然你想在函数内部 malloc Destination,你应该这样做

char * DoSomething( char **Destination )
{
   // free( Destination ); why?

   //re-allocate memory
   *Destination = malloc( some number );

   //then do something...       

   //finally
   return *Destination;
}

这是如何使用指针的演示

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

char *copyString(const char *const source)
{
    char *result;
    int   length;

    length = strlen(source);
    result = malloc(length + 1);
    if (result == NULL)
        return NULL;
    strcpy(result, source);

    printf("The address of result is : %p\n", result);
    printf("The content of result is : %s\n", result);
    printf("The first character of result is @ %p\n", &result[0]);

    return result;
}

int main()
{
    char *string = copyString("This is an example");

    printf("\n");

    printf("The address of string is : %p\n", string);
    printf("The content of string is : %s\n", string);
    printf("The first character of string is @ %p\n", &string[0]);

    /* we used string for the previous demonstration, now we can free it */
    free(string);

    return 0;
}

如果执行前面的程序,会发现指针都指向同一块内存,内存中的内容也是一样的,所以在main()中调用free会释放记忆。

这是正确的做法

char    *Pointer;

//,,, maybe allocating memory and assigning its address to Pointer
//... though it is not necessary because it is a global variable and
//... will be initialized by zero. So you may apply function free to the pointer.

char *MyChar = DoSomething( Pointer );


char * DoSomething( char *Destination )
{
   free( Destination );

   //re-allocate memory
   Destination = malloc( some number );

   //then do something...       

   //finally
   return Destination;
}

至于你的代码那么

  1. 参数类型与函数调用中的参数类型不对应

    char *MyChar = DoSomething (&Pointer);

参数的类型是 char * ( char *Destination ) 而参数的类型是 char ** ( &指针 )

  1. 由于 Destination 是指针,因此

    免费(*目的地);

你必须写

   free( Destination );

这是因为你在行

中传递了指针 char *Pointer 的地址
char *MyChar = DoSomething (&Pointer);

由于您在函数中传递了指针的地址 DoSomething 它会将函数范围变量 Destination 视为指向地址的指针,该地址是指针的地址 Pointer.

所以不要用

传递Pointer的地址
char *MyChar = DoSomething(&Pointer);

你需要像这样传入指针本身:

char *MyChar = DoSomething(Pointer);

这将允许您使用

free(Destination);

注意缺少 & 表示 Pointer 的地址。