找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1716|回復(fù): 11
收起左側(cè)

關(guān)于C語言的2個(gè)問題,為什么使用*pt=wordpt;會(huì)報(bào)錯(cuò)

[復(fù)制鏈接]
ID:879924 發(fā)表于 2022-1-24 21:29 | 顯示全部樓層 |閱讀模式
#include <stdio.h>
#include <stdlib.h
#include <string.h>

int main(void)
{
        int i;
        int count;
        char **pt;
        printf("How many words do you wish to enter? \n");
        scanf("%d",&count);
        printf("Enter %d words now: \n",count);
        pt=(char**)malloc(count*sizeof(char*));
        for(i=0;i<count;i++)
        {
                char *wordpt;
                int len;
                char temp[100];
                scanf("%s",temp);
                len=strlen(temp);
                wordpt=(char*)malloc(len*sizeof(char));
                strcpy(wordpt,temp);
//                *pt[ i]=wordpt;
                *(pt+i)=wordpt;
//                free(wordpt);
        }
        for(i=0;i<count;i++)
        {
                printf("%s\n",*(pt+i));
               
        }

        free(pt);
        printf("Done!\n");
        return 0;        
}


1.為什么使用*pt[ i]=wordpt;會(huì)報(bào)錯(cuò),而*(pt+i)=wordpt;卻可以,不是一樣的嗎?
2.為什么wordpt不用free?free了就會(huì)報(bào)錯(cuò)。

回復(fù)

使用道具 舉報(bào)

ID:844772 發(fā)表于 2022-1-25 09:52 | 顯示全部樓層
1.正確的寫法是pt[ i]=wordpt;  它跟*(pt+i)=wordpt;才一樣,看明白吧?
2.當(dāng)然不能free了,你把wordpt的空間地址給了pt[i],如果free了,相當(dāng)于把pt[i]的空間釋放了,等下print啥啊。
3.為啥在這問C的問題?
回復(fù)

使用道具 舉報(bào)

ID:879924 發(fā)表于 2022-1-25 19:14 | 顯示全部樓層
glinfei 發(fā)表于 2022-1-25 09:52
1.正確的寫法是pt[ i]=wordpt;  它跟*(pt+i)=wordpt;才一樣,看明白吧?
2.當(dāng)然不能free了,你把wordpt的 ...

這里的人友善熱情,除此之外不知道去哪里問了。。。謝謝你,,,明白啦~
回復(fù)

使用道具 舉報(bào)

ID:879924 發(fā)表于 2022-1-25 19:23 | 顯示全部樓層
glinfei 發(fā)表于 2022-1-25 09:52
1.正確的寫法是pt[ i]=wordpt;  它跟*(pt+i)=wordpt;才一樣,看明白吧?
2.當(dāng)然不能free了,你把wordpt的 ...

還有一個(gè)不解,就是 free了pt  就連同wordpt 一起釋放了嗎? wordpt可以單獨(dú)釋放嗎? 我在return 前面  free(pt)后面 free(pt)前面 free wordpt 都會(huì)出錯(cuò)。。。
回復(fù)

使用道具 舉報(bào)

ID:844772 發(fā)表于 2022-1-26 11:16 | 顯示全部樓層
macboa 發(fā)表于 2022-1-25 19:23
還有一個(gè)不解,就是 free了pt  就連同wordpt 一起釋放了嗎? wordpt可以單獨(dú)釋放嗎? 我在return 前面  f ...

1.你用debug看看就知道,pt【i】和wordpt內(nèi)容相同,指向同一個(gè)地址,所以free一個(gè),另一個(gè)也失效了。
2.free了pt,wordpt剛才給它的空間沒釋放,只是沒法通過pt使用了;
3.二級(jí)指針的釋放,應(yīng)該逐個(gè)釋放 比如先 for (i=0;i<count;i++) free(pt[ i]);   再釋放 free(pt); 你在程序中僅僅free(pt),會(huì)造成無法回收的內(nèi)存碎片。
回復(fù)

使用道具 舉報(bào)

ID:879924 發(fā)表于 2022-1-26 12:41 | 顯示全部樓層
glinfei 發(fā)表于 2022-1-26 11:16
1.你用debug看看就知道,pt【i】和wordpt內(nèi)容相同,指向同一個(gè)地址,所以free一個(gè),另一個(gè)也失效了。
2. ...

那么wordpt 要在什么地方釋放呢???
我換了幾個(gè)地方,都是編譯出錯(cuò)
回復(fù)

使用道具 舉報(bào)

ID:526543 發(fā)表于 2022-1-26 12:52 | 顯示全部樓層
pt[ i]=wordpt;  它跟*(pt+i)=wordpt
回復(fù)

使用道具 舉報(bào)

ID:844772 發(fā)表于 2022-1-26 14:52 | 顯示全部樓層
macboa 發(fā)表于 2022-1-26 12:41
那么wordpt 要在什么地方釋放呢???
我換了幾個(gè)地方,都是編譯出錯(cuò)

我上邊說了,你在free(pt);之前加上 for (i=0;i<count;i++) free(pt);  就相當(dāng)于把每個(gè)wordpt都釋放了。wordpt申請(qǐng)的空間,你用在pt[ i]了,所以不可能提前釋放的,合適的位置在 printf("%s\n",*(pt+i));之后,而且不能用wordpt,因?yàn)樗挥涗浟俗詈笠粋(gè)地址。
其實(shí) wordpt=(char*)malloc(len*sizeof(char)); 也有問題,少申請(qǐng)了一個(gè)字節(jié),因?yàn)閟trlen()測(cè)的長(zhǎng)度不包含結(jié)尾的NULL,但strcpy是包含的。
回復(fù)

使用道具 舉報(bào)

ID:879924 發(fā)表于 2022-1-26 20:09 | 顯示全部樓層
123456ZXC1 發(fā)表于 2022-1-26 12:52
pt[ i]=wordpt;  它跟*(pt+i)=wordpt

謝謝您,明白啦
回復(fù)

使用道具 舉報(bào)

ID:879924 發(fā)表于 2022-1-26 20:13 | 顯示全部樓層
glinfei 發(fā)表于 2022-1-26 14:52
我上邊說了,你在free(pt);之前加上 for (i=0;i

我大概明白了。。。 應(yīng)該是 for (i=0;i<count;i++) free(pt[ i]); free(pt);是吧!實(shí)際上申請(qǐng)了count次內(nèi)存空間,但是wordpt不斷的被更新,所以只記錄了最后一個(gè)地址。。。如果free(wordpt)就只釋放最后一次內(nèi)存空間。應(yīng)該是這個(gè)意思吧?
回復(fù)

使用道具 舉報(bào)

ID:844772 發(fā)表于 2022-1-27 10:26 | 顯示全部樓層
macboa 發(fā)表于 2022-1-26 20:13
我大概明白了。。。 應(yīng)該是 for (i=0;i

是 for (i=0;i<count;i++) free(pt[ i]); 輸入法沒弄好,我少打了[ i]。另外我覺得指針熟練用一種方法就夠啦,這些是為數(shù)據(jù)結(jié)構(gòu)和算法服務(wù)的。
回復(fù)

使用道具 舉報(bào)

ID:879924 發(fā)表于 2022-1-27 20:53 | 顯示全部樓層

謝謝  腦子里想著 pt[ i] 結(jié)果也打成了pt
這下都明白了。。再次感謝大神
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表