| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1260 人关注过本帖
标题:求大虾指导一个指针数组的问题
取消只看楼主 加入收藏
sisox
Rank: 2
等 级:论坛游民
帖 子:19
专家分:28
注 册:2012-1-25
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:7 
求大虾指导一个指针数组的问题
程序代码:
#include <stdio.h>
#include <stdlib.h>
void str_out(char *p[],int n);
int main(void) {
    char *p[3]={NULL};
    char a[]="test1";
    char b[]="test2";
    char c[]="test2";
    p[0]=a;
    p[1]=b;
    p[2]=c;
   str_out(p,3);
    return 0;
}
void str_out(char *p[],int n) {
    int i=0;
    for( ;i<n;i++ ) {
        printf("%s\n",*p);
        free(*p);
        *p++=NULL;
    }
    return;
}                  
以上代码编译运行后没有问题.
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *p[3]={NULL};
    char a[]="test1";
    char b[]="test2";
    char c[]="test2";
    p[0]=a;
    p[1]=b;
    p[2]=c;
    int i=0;
    for( ;i<3;i++ ) {
        printf("%s\n",*p);
        free(*p);
        *p++=NULL;
//在该句将会报错  mingw提示: 错误:自增操作数必须是左值(左值:C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量)
    }
    return 0;
}

将str_out的代码放到main()中就会编译出错
环境是editplus+mingw

我个人的理解在 15L 由于不想让帖子太长 所以就给个链接 抱歉:https://bbs.bccn.net/viewthread.php?tid=415141&extra=&page=2#pid2313352

说明一下:
关于那些看起来很烦人的 a b c 的问题
我只是为了测试一下代码功能
书上的str_out包含于一个程序中
程序的功能是 : 读取命令行的多行输入 让后对多行语句进行字母排序并显示
我将str_out单独挑出来实验一下 所以添加 a,b,c 省去前面的读取命令行输入的代码 望大家可以理解

附上Editplus的编译&运行结果:
第一个代码
图片附件: 游客没有浏览图片的权限,请 登录注册

第二个代码
图片附件: 游客没有浏览图片的权限,请 登录注册



[ 本帖最后由 sisox 于 2013-6-14 02:13 编辑 ]
搜索更多相关主题的帖子: color 
2013-06-14 00:27
sisox
Rank: 2
等 级:论坛游民
帖 子:19
专家分:28
注 册:2012-1-25
收藏
得分:0 
回复 2楼 蚕头燕尾
谢谢提醒
自己想让语句显得简洁些就改了一下
之前的代码也可以在Editplus上面编译并且运行 但是会有警告 你试试新改的行不行
2013-06-14 01:22
sisox
Rank: 2
等 级:论坛游民
帖 子:19
专家分:28
注 册:2012-1-25
收藏
得分:0 
回复 6楼 蚕头燕尾
谢谢回答 这个for循环的代码是摘抄的书上的一个代码(本来是置于str_out函数中) 我只是想测试一下放在main()中会如何
2013-06-14 01:35
sisox
Rank: 2
等 级:论坛游民
帖 子:19
专家分:28
注 册:2012-1-25
收藏
得分:0 
回复 7楼 蚕头燕尾
关于那个添加 a b c 的问题
我只是为了测试一下
书上的str_out包含于一个程序中
程序的功能是 : 读取命令行的多行输入 让后对多行语句进行字母排序并显示
我将str_out单独挑出来实验一下 所以添加 a,b,c 省去前面的读取命令行输入的环节
2013-06-14 01:38
sisox
Rank: 2
等 级:论坛游民
帖 子:19
专家分:28
注 册:2012-1-25
收藏
得分:0 
回复 9楼 蚕头燕尾
..我没说书上一定是对啊
我只是想知道为什么放在一个单独的函数中和放在main函数中结果会不一样
2013-06-14 01:39
sisox
Rank: 2
等 级:论坛游民
帖 子:19
专家分:28
注 册:2012-1-25
收藏
得分:0 
回复 13楼 dengluoy
我的问题不是在free上面 书上的free是希望读者养成释放内存的习惯 测试中去掉free似乎没影响
我的问题是在*p++=NULL这行中 他在独立的函数 str_out中是不会有问题的 在main()中则会有问题

(以下个人观点基于第一个代码)
我对我的指针数组p的理解 : p中包含三个指针 p[0] p[1] p[2] 赋值后指向 a,b,c字符串的首地址
调用函数的时候传入p 从而str_out函数中的p数组的地址和main中的p是一样的
第一次循环的时候 p指向p[0] *p则是读取p[0]中存储的数据 即字符串a的首地址 printf在接收到字符串首地址之后便能打印出该字符串
*p++=NULL的作用是将现在的p中的存储数据设为NULL 然后将p递增从而指向p[1](或p[2]) 通过下一次的循环的*p能够读取b(或c)字符串的首地址  
由此我的第一个代码在我的环境中是可以编译执行的  我的问题出在了第二个代码中

以上是个人观点 有问题欢迎指出 本人也只是小白


BTW: 没装VS,所以不能测试 不好意思
2013-06-14 02:09
sisox
Rank: 2
等 级:论坛游民
帖 子:19
专家分:28
注 册:2012-1-25
收藏
得分:0 
回复 17楼 神经不正常
恩 这个free确实是多余的 程序前面有用malloc() 我单独拿出来的时候没去掉free 但是编译的时候free是不会有报错的
错误出在*p++=NULL这句上 我觉得16L已经解释清楚了
2013-06-14 11:37
sisox
Rank: 2
等 级:论坛游民
帖 子:19
专家分:28
注 册:2012-1-25
收藏
得分:0 
回复 16楼 embed_xuel
谢谢指点 我大概懂原因了 书上的讲解也跟你一样 是说p成了指针 那由此我引发了一个问题想请教你一下
 str_out中的p在声明的时候是 char *p[]
 main中的p在声明的时候也是 char *p[](之后称作 pM 吧)
那么str_out 中的p为什么成了指针而不是一个指针数组,他们的声明形式不是一样的吗?
 书上的讲解是说将p传递入str_out 函数将接收到pM的地址的副本 由此可将p当做指针
2013-06-14 12:22
快速回复:求大虾指导一个指针数组的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026246 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved