在方法c中传递双指针

passing Double pointer in methods c

本文关键字:指针 方法      更新时间:2023-10-16

为什么当双指针作为单指针发送到函数并被访问时,在尝试分配内存时不会出现错误,即使在堆上分配内存,也会导致分段错误。


将双指针作为双指针参数传递给函数-效果良好

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void to_fun(char **dbl_ptr)
    {
      *dbl_ptr = malloc(20);
      strcpy(*dbl_ptr,"cool");
    }
    void main( )
    {
        char **dbl_ptr = calloc ( 2 , sizeof(char *) );
        to_fun ( (dbl_ptr + 1) );
        printf("%sn",*(dbl_ptr + 1) );
    }

将双指针作为单指针参数传递给函数-seg fault

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void to_fun(char *dbl_ptr)
{
  dbl_ptr = malloc(20);
  strcpy(dbl_ptr,"defnitely not cool");
}
void main( )
{
    char **dbl_ptr = calloc ( 2 , sizeof(char *) );
    to_fun ( *(dbl_ptr + 1) );
    printf("%sn",*(dbl_ptr + 1) );
}

将双指针作为单指针参数传递给函数-效果良好

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void to_fun(char *dbl_ptr)
{
  printf("%sn",dbl_ptr );
}
void main( )
{
    char **dbl_ptr = calloc ( 2 , sizeof(char *) );
    *(dbl_ptr + 1) = "cool";
    to_fun ( *(dbl_ptr + 1) );
}

这只是一个让你得到问题的示例代码。。这不意味着像即兴创作的一个等等。。。

我知道指针和取消引用是如何深入工作的,但上面的内容仍然很烦人。任何人解释原因。

第一个代码块之所以有效,是因为您传递了一个指针,然后取消引用该指针以修改指针指向的内容(即main中分配的内存块(。

在第二个代码块的情况下,您正在修改函数参数dbl_ptr。函数参数的更改不会反映在调用函数中,因为所有参数都是按值传递的。

第三块代码之所以有效,是因为您正在读取一个函数参数并取消引用指向有效内存的指针值。

此外,您不是将char **传递给第二个和第三个函数,而是将char *传递给第三个。

您在main中也没有分配足够的内存。您分配了2个字节,但您想要的是2个char *:的空间

char **dbl_ptr = calloc ( 2 , sizeof(char *) );

当您想从函数内部修改变量,而该变量在函数范围之外时,您可以传递一个指向变量的指针:

void f(double *x) {
  *x = 12;
}
void main() {
  double z;
  f(&z);
  printf("%f", z);
}

当你的变量是一个指针时,你需要一个指向指针的指针:

void f(double **x) {
  *x = malloc(...);
}
void main() {
  double *z;
  f(&z);
  printf("%f", z[1]);
}