当前位置:首页C语言 > 正文

【内部资料】双重指针 char **p 的含义

作者:野牛程序员:2023-10-30 14:45:45C语言阅读 2804

双重指针 char **p  的含义

双重指针 char **p 是指一个指向指针的指针,通常用于在函数中修改指针的值或传递指针的地址。它的含义可以通过以下方式来理解:

  • char *p 表示一个指向字符的指针,它可以用来指向字符数组或字符串。

  • char **p 表示一个指向指向字符的指针,也就是指向指针的指针。这可以用来修改指针的值,以便它指向不同的字符数组或字符串,或者用来传递指针的地址。

在函数中,使用双重指针 char **p 可以改变指针的指向,以便在函数外部可以访问到新的指针值。这在需要动态分配内存或修改指针值时非常有用,特别是在涉及字符串处理或多维数组的情况下。

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

void getmemory(char **p) {
    *p = (char *)malloc(100);
    strcpy(*p, "hello world");
}

int main() {
    char *str = NULL;
    getmemory(&str);
    if (str != NULL) {
        printf("%s\\n", str);
        free(str);
    }
    return 0;
}

现在,通过使用双重指针 char **p,在 getmemory 函数中分配的内存地址将被正确传递回到 main 函数中,避免了程序崩溃。在使用 str 之前,还需要检查它是否为 NULL,以确保内存已经成功分配。

getmemory 函数接受一个指向指针的指针 char **p,并在其中分配了内存并将其地址赋给 *p,这样就可以在 main 函数中修改 str 指针的值。



问题代码:

void getmemory(char *p)
{
    p=(char *) malloc(100);
    strcpy(p,"hello world");
}
int main( )
{
    char *str=NULL;
    getmemory(str);
    printf("%s\\n",str);
    free(str);
    return 0;
}

这段代码存在问题。在 getmemory 函数内,虽然尝试分配内存并复制字符串,但是由于参数 char *p 是按值传递的,所以对 p 的更改不会在 main 函数中反映出来。在这种情况下,str 仍然是 NULL,所以在 printffree 中使用它会导致程序崩溃。

描述:

在main函数中,声明了一个char类型的指针str,并将其初始化为NULL。调用getmemory函数,将str作为参数传递给它。

在函数内部,指针p被初始化为传递进来的str的副本。

在getmemory函数中,为p分配内存并复制字符串 "hello world"。

这些操作影响的是函数内部的p,而不是main函数中的str。

当getmemory函数完成时,函数内部的p超出作用域,它的生命周期结束。

这意味着任何在getmemory函数中分配的内存都不能被main函数访问。

因此main函数中的str仍然是NULL。

因此,main函数中的printf语句将打印一个空指针,而不是 "hello world"。

然而,对空指针使用free函数会导致问题。free函数用于释放动态分配的内存,但如果尝试释放一个空指针,它会导致未定义行为。未定义行为意味着程序的行为是不确定的,可能导致程序崩溃。



野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击