找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1341|回复: 11
收起左侧

关于C语言的2个问题,为什么使用*pt=wordpt;会报错

[复制链接]
ID:879924 发表于 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;会报错,而*(pt+i)=wordpt;却可以,不是一样的吗?
2.为什么wordpt不用free?free了就会报错。

回复

使用道具 举报

ID:844772 发表于 2022-1-25 09:52 | 显示全部楼层
1.正确的写法是pt[ i]=wordpt;  它跟*(pt+i)=wordpt;才一样,看明白吧?
2.当然不能free了,你把wordpt的空间地址给了pt[i],如果free了,相当于把pt[i]的空间释放了,等下print啥啊。
3.为啥在这问C的问题?
回复

使用道具 举报

ID:879924 发表于 2022-1-25 19:14 | 显示全部楼层
glinfei 发表于 2022-1-25 09:52
1.正确的写法是pt[ i]=wordpt;  它跟*(pt+i)=wordpt;才一样,看明白吧?
2.当然不能free了,你把wordpt的 ...

这里的人友善热情,除此之外不知道去哪里问了。。。谢谢你,,,明白啦~
回复

使用道具 举报

ID:879924 发表于 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 都会出错。。。
回复

使用道具 举报

ID:844772 发表于 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),会造成无法回收的内存碎片。
回复

使用道具 举报

ID:879924 发表于 2022-1-26 12:41 | 显示全部楼层
glinfei 发表于 2022-1-26 11:16
1.你用debug看看就知道,pt【i】和wordpt内容相同,指向同一个地址,所以free一个,另一个也失效了。
2. ...

那么wordpt 要在什么地方释放呢???
我换了几个地方,都是编译出错
回复

使用道具 举报

ID:526543 发表于 2022-1-26 12:52 | 显示全部楼层
pt[ i]=wordpt;  它跟*(pt+i)=wordpt
回复

使用道具 举报

ID:844772 发表于 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是包含的。
回复

使用道具 举报

ID:879924 发表于 2022-1-26 20:09 | 显示全部楼层
123456ZXC1 发表于 2022-1-26 12:52
pt[ i]=wordpt;  它跟*(pt+i)=wordpt

谢谢您,明白啦
回复

使用道具 举报

ID:879924 发表于 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)就只释放最后一次内存空间。应该是这个意思吧?
回复

使用道具 举报

ID:844772 发表于 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]。另外我觉得指针熟练用一种方法就够啦,这些是为数据结构和算法服务的。
回复

使用道具 举报

ID:879924 发表于 2022-1-27 20:53 | 显示全部楼层

谢谢  脑子里想着 pt[ i] 结果也打成了pt
这下都明白了。。再次感谢大神
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表