基础的指针传递问题?

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

void getp(char *p)
{
   *p = malloc(1000); 
}

int main()
{
   char *p = NULL; 
    getp(p);
    strcpy(p, "hello");
    printf("%s\n", p);
}

以上代码为什么错了?
为甚getp的参数要改为双指针,getp(char **p)?

阅读 2.9k
4 个回答
    // 这里本身就有问题 ,而且问题很多啊兄台。
    // 1.首先 首先 拿到指针就直接 *p, 嗯, 你对这个p很自信。你在main函数里甚至直接给到 p = NULL;
    // * NULL 。 你想干嘛?
    // 2. p是一个指针, *p 是p指向的某个char, malloc后的首地址赋给char会溢出吧?
    // 3. 我猜你的意思是想 p = (char*) malloc(1000); 或者干脆参数是void* 稳一点不好吗? 
   *p = malloc(1000); 

修改了下代码 debug下看看,看完应该就明白怎么回事了:

// 你的意图大概是想让getp完成这么一个功能:开辟一段内存空间,然后首地址给到p,外面拿p来操作
// 照你上面的思路,等价于:
void getP1(char *p){
    printf("参数传入p的地址\t %p \n", p);
    char *pChar = (char*) malloc(1000);
     printf("分配的内存首地址是\t %p \n", pChar);
     p = pChar;
     printf("假装赋值后p的地址是\t %p \n", p);
}

// 传入指针的指针
void getP2(char** p){
    printf("参数传入p的地址\t %p \n", *p);
    char *pChar = (char*) malloc(1000);
     printf("分配的内存首地址是\t %p \n", pChar);
     *p = pChar;
     printf("赋值后p的地址是\t %p \n", *p);
}

int main()
{
    char x = 1;
    char *p = &x;
    printf("main中p的地址 %p\n", p);
    // getP1(p);
    getP2(&p);
    printf("main函数中getp之后p的地址是\t %p \n", p);
    strcpy(p, "hello word");
    printf("%s\n", p);
}

函数参数单指针只是把指针的地址传进去了,而你要实现的是把指针所指向的内容更改

使用char *p,会导致一个问题,看getp*p的类型是char,而malloc返回值的类型是void*,类型不一致;若改成char **p。可以从类型的角度想想。

函数getp() 里的 *p = malloc(1000) 是指开1000的内存,并将首地址给 p 指针里的值,因此,要求 *p 也是一个指针(注意这里的*代表取值运算符),因此要求传入的参数是指针的指针。

猜测你代码的意图,应该将getp()函数里改成 p = malloc(1000)即可。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题