免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2639 | 回复: 14
打印 上一主题 下一主题

请教关于指针运算 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-28 17:00 |只看该作者 |倒序浏览
在第二版的apue中文p101 的这个函数:
static int                                      /* we return whatever func() returns */
75 dopath(Myfunc* func)
76 {
77         struct stat             statbuf;
78         struct dirent   *dirp;
79         DIR                             *dp;
80         int                             ret;
81         char                    *ptr;
82
83         if (lstat(fullpath, &statbuf) < 0)      /* stat error */
84                 return(func(fullpath, &statbuf, FTW_NS));
85         if (S_ISDIR(statbuf.st_mode) == 0)      /* not a directory */
86                 return(func(fullpath, &statbuf, FTW_F));
87
88         /*
89          * It's a directory.  First call func() for the directory,
90          * then process each filename in the directory.
91          */
92         if ((ret = func(fullpath, &statbuf, FTW_D)) != 0)
93                 return(ret);
94
95         ptr = fullpath + strlen(fullpath);      /* point to end of fullpath */
96         *ptr++ = '/';
97         *ptr = 0;
98
99         if ((dp = opendir(fullpath)) == NULL)   /* can't read directory */
100                 return(func(fullpath, &statbuf, FTW_DNR));
101
102         while ((dirp = readdir(dp)) != NULL) {
103                 if (strcmp(dirp->d_name, ".") == 0  ||
104                     strcmp(dirp->d_name, "..") == 0)
105                                 continue;               /* ignore dot and dot-dot */
106
107                 strcpy(ptr, dirp->d_name);      /* append name after slash */
108
109                 if ((ret = dopath(func)) != 0)          /* recursive */
110                         break;  /* time to leave */
111         }
112        ptr[-1] = 0;   /* erase everything from slash onwards */
113
114         if (closedir(dp) < 0)
115                 err_ret("can't close directory %s", fullpath);
116
117 return(ret);
118}
ptr[-1] = 0;   怎样起到 erase everything from slash onwards的作用的???
作了一个小测试:
1 #include<stdio.h>
  2 #include<stdlib.h>
  3
  4 int
  5 main(void)
  6 {
  7 char *p;
  8 int i;
  9 p=(char *)malloc(sizeof("abcdefg")*10);
10 if (p!=NULL){
11 p="abcdefg"+strlen("abcdefg");
12 p=p-3;
13 printf(p);
14 p[-1]=0;
15 }
16 exit(0);
17 }

gcc 编译通过 但是运行a.out 就得到:
Bus error: 10 (core dumped)
apue里的示例代码却可以编译运行
记忆中array i不能为负数丫
十分疑惑 请各位大大解答
谢谢

[ 本帖最后由 坏坏小少 于 2007-3-28 17:40 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-03-28 17:07 |只看该作者
9 p=(char *)malloc(sizeof("abcdefg")*10);
11 p="abcdefg"+strlen("abcdefg");
这两句啥意思?

论坛徽章:
0
3 [报告]
发表于 2007-03-28 17:09 |只看该作者

  1.         ptr = fullpath + strlen(fullpath);      /* point to end of fullpath */
  2.         * ptr ++ = '/';
  3.         * ptr = 0;
  4.         ...
  5.         ...
  6.         ptr[-1] = 0;   /* erase everything from slash onwards */
复制代码


人家修改的是栈上或者堆上的数据,你呢? 你的代码报错不足为奇

如果你把 p 的定义换成 char p[70] = { "abcdefg" };,再看看会不会core dump?

论坛徽章:
0
4 [报告]
发表于 2007-03-28 17:10 |只看该作者
原帖由 lenovo 于 2007-3-28 17:07 发表
9 p=(char *)malloc(sizeof("abcdefg")*10);
11 p="abcdefg"+strlen("abcdefg");
这两句啥意思?


对哦,我都没注意这里。。。字符串+size_t类型得出来什么结果?

论坛徽章:
0
5 [报告]
发表于 2007-03-28 17:24 |只看该作者
关键是别人的p[-1]仍然在自己控制的范围内!

论坛徽章:
0
6 [报告]
发表于 2007-03-28 17:32 |只看该作者
原帖由 Neil 于 2007-3-28 17:10 发表


对哦,我都没注意这里。。。字符串+size_t类型得出来什么结果?

仿照 95         ptr = fullpath + strlen(fullpath);      /* point to end of fullpath */ 写的
作用作者说了的
如果你把 p 的定义换成 char p[70] = { "abcdefg" };,再看看会不会core dump?

可以正常运行了
但是不知所以然
关键是别人的p[-1]仍然在自己控制的范围内!

能仔细说下???

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-03-28 17:32 |只看该作者
p="abcdefg"+strlen("abcdefg");
语法上不会有错误,运行时也一定正确,但是语义不明,说白了就是脱裤子放屁。

论坛徽章:
0
8 [报告]
发表于 2007-03-28 17:35 |只看该作者
原帖由 flw 于 2007-3-28 17:32 发表
p="abcdefg"+strlen("abcdefg");
语法上不会有错误,运行时也一定正确,但是语义不明,说白了就是脱裤子放屁。

把指针指向'\0'了吧
照95行注释的理解

[ 本帖最后由 坏坏小少 于 2007-3-28 17:36 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2007-03-28 17:37 |只看该作者
原帖由 坏坏小少 于 2007-3-28 17:35 发表

把指针指向'\0'了吧

对。

论坛徽章:
0
10 [报告]
发表于 2007-03-28 17:42 |只看该作者
112        ptr[-1] = 0;   /* erase everything from slash onwards */
那么 ptr[-1]的语义是什么呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP