鍍金池/ 問答/C  C++  Linux/ 基礎(chǔ)的指針傳遞問題?

基礎(chǔ)的指針傳遞問題?

#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);
}

以上代碼為什么錯(cuò)了?
為甚getp的參數(shù)要改為雙指針,getp(char **p)?

回答
編輯回答
情未了

使用char *p,會(huì)導(dǎo)致一個(gè)問題,看getp,*p的類型是char,而malloc返回值的類型是void*,類型不一致;若改成char **p。可以從類型的角度想想。

2017年9月8日 03:38
編輯回答
乞許

函數(shù)getp() 里的 *p = malloc(1000) 是指開1000的內(nèi)存,并將首地址給 p 指針里的值,因此,要求 *p 也是一個(gè)指針(注意這里的*代表取值運(yùn)算符),因此要求傳入的參數(shù)是指針的指針。

猜測你代碼的意圖,應(yīng)該將getp()函數(shù)里改成 p = malloc(1000)即可。

2018年9月6日 15:56
編輯回答
老梗

函數(shù)參數(shù)單指針只是把指針的地址傳進(jìn)去了,而你要實(shí)現(xiàn)的是把指針?biāo)赶虻膬?nèi)容更改

2017年6月14日 12:06
編輯回答
浪婳
    // 這里本身就有問題 ,而且問題很多啊兄臺(tái)。
    // 1.首先 首先 拿到指針就直接 *p, 嗯, 你對這個(gè)p很自信。你在main函數(shù)里甚至直接給到 p = NULL;
    // * NULL 。 你想干嘛?
    // 2. p是一個(gè)指針, *p 是p指向的某個(gè)char, malloc后的首地址賦給char會(huì)溢出吧?
    // 3. 我猜你的意思是想 p = (char*) malloc(1000); 或者干脆參數(shù)是void* 穩(wěn)一點(diǎn)不好嗎? 
   *p = malloc(1000); 

修改了下代碼 debug下看看,看完應(yīng)該就明白怎么回事了:

// 你的意圖大概是想讓getp完成這么一個(gè)功能:開辟一段內(nèi)存空間,然后首地址給到p,外面拿p來操作
// 照你上面的思路,等價(jià)于:
void getP1(char *p){
    printf("參數(shù)傳入p的地址\t %p \n", p);
    char *pChar = (char*) malloc(1000);
     printf("分配的內(nèi)存首地址是\t %p \n", pChar);
     p = pChar;
     printf("假裝賦值后p的地址是\t %p \n", p);
}

// 傳入指針的指針
void getP2(char** p){
    printf("參數(shù)傳入p的地址\t %p \n", *p);
    char *pChar = (char*) malloc(1000);
     printf("分配的內(nèi)存首地址是\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函數(shù)中g(shù)etp之后p的地址是\t %p \n", p);
    strcpy(p, "hello word");
    printf("%s\n", p);
}
2017年4月28日 07:35