欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 關于C語言的2個問題,為什么使用*pt=wordpt;會報錯 [打印本頁]

作者: macboa    時間: 2022-1-24 21:29
標題: 關于C語言的2個問題,為什么使用*pt=wordpt;會報錯
#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;會報錯,而*(pt+i)=wordpt;卻可以,不是一樣的嗎?
2.為什么wordpt不用free?free了就會報錯。


作者: glinfei    時間: 2022-1-25 09:52
1.正確的寫法是pt[ i]=wordpt;  它跟*(pt+i)=wordpt;才一樣,看明白吧?
2.當然不能free了,你把wordpt的空間地址給了pt[i],如果free了,相當于把pt[i]的空間釋放了,等下print啥啊。
3.為啥在這問C的問題?
作者: macboa    時間: 2022-1-25 19:14
glinfei 發表于 2022-1-25 09:52
1.正確的寫法是pt[ i]=wordpt;  它跟*(pt+i)=wordpt;才一樣,看明白吧?
2.當然不能free了,你把wordpt的 ...

這里的人友善熱情,除此之外不知道去哪里問了。。。謝謝你,,,明白啦~
作者: macboa    時間: 2022-1-25 19:23
glinfei 發表于 2022-1-25 09:52
1.正確的寫法是pt[ i]=wordpt;  它跟*(pt+i)=wordpt;才一樣,看明白吧?
2.當然不能free了,你把wordpt的 ...

還有一個不解,就是 free了pt  就連同wordpt 一起釋放了嗎? wordpt可以單獨釋放嗎? 我在return 前面  free(pt)后面 free(pt)前面 free wordpt 都會出錯。。。
作者: glinfei    時間: 2022-1-26 11:16
macboa 發表于 2022-1-25 19:23
還有一個不解,就是 free了pt  就連同wordpt 一起釋放了嗎? wordpt可以單獨釋放嗎? 我在return 前面  f ...

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

作者: macboa    時間: 2022-1-26 12:41
glinfei 發表于 2022-1-26 11:16
1.你用debug看看就知道,pt【i】和wordpt內容相同,指向同一個地址,所以free一個,另一個也失效了。
2. ...

那么wordpt 要在什么地方釋放呢???
我換了幾個地方,都是編譯出錯
作者: 123456ZXC1    時間: 2022-1-26 12:52
pt[ i]=wordpt;  它跟*(pt+i)=wordpt
作者: glinfei    時間: 2022-1-26 14:52
macboa 發表于 2022-1-26 12:41
那么wordpt 要在什么地方釋放呢???
我換了幾個地方,都是編譯出錯

我上邊說了,你在free(pt);之前加上 for (i=0;i<count;i++) free(pt);  就相當于把每個wordpt都釋放了。wordpt申請的空間,你用在pt[ i]了,所以不可能提前釋放的,合適的位置在 printf("%s\n",*(pt+i));之后,而且不能用wordpt,因為它只記錄了最后一個地址。
其實 wordpt=(char*)malloc(len*sizeof(char)); 也有問題,少申請了一個字節,因為strlen()測的長度不包含結尾的NULL,但strcpy是包含的。

作者: macboa    時間: 2022-1-26 20:09
123456ZXC1 發表于 2022-1-26 12:52
pt[ i]=wordpt;  它跟*(pt+i)=wordpt

謝謝您,明白啦
作者: macboa    時間: 2022-1-26 20:13
glinfei 發表于 2022-1-26 14:52
我上邊說了,你在free(pt);之前加上 for (i=0;i

我大概明白了。。。 應該是 for (i=0;i<count;i++) free(pt[ i]); free(pt);是吧!實際上申請了count次內存空間,但是wordpt不斷的被更新,所以只記錄了最后一個地址。。。如果free(wordpt)就只釋放最后一次內存空間。應該是這個意思吧?
作者: glinfei    時間: 2022-1-27 10:26
macboa 發表于 2022-1-26 20:13
我大概明白了。。。 應該是 for (i=0;i

是 for (i=0;i<count;i++) free(pt[ i]); 輸入法沒弄好,我少打了[ i]。另外我覺得指針熟練用一種方法就夠啦,這些是為數據結構和算法服務的。
作者: macboa    時間: 2022-1-27 20:53
glinfei 發表于 2022-1-27 10:26
是 for (i=0;i

謝謝  腦子里想著 pt[ i] 結果也打成了pt
這下都明白了。。再次感謝大神




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1