ios下指针操作的疑惑?

2014-01-10 11:07:18 +08:00
 GalvinZhao
在做一个字符串处理方法时候,用到了strsep()这个方法,ios 5下正常,ios 7 下报错,
加入方法的源码,发现在指针的操作处报错,EXC_BAD_ACCESS,百撕不得其姐啊

伪码说明下
strsep(char **stringp, const char *delim){
char *s
s = *stringp
s ++; //之前有++的动作
s[-1] = 0; //这里错误怎么理解?
}

尝试了其他方法,应该是对这个内存操作就会报错
void func(char *read){
char *q;
q = read;
for (;*q != 0; q++){
if (*q == '|') {
*q = '\0'; //这里会出错
}
}
}
不知道这个错误该如何理解?
1788 次点击
所在节点    C
11 条回复
fangzhzh
2014-01-10 11:44:54 +08:00
analyze一下, 编译器升级了后 ,有的以前的warning,就直接给你认为是bug了.
guoxx_
2014-01-10 13:37:10 +08:00
lz能贴一下调用地方的代码吗?
从上面的代码来看,应该是调用的char *read所在的段不可写
fangzhzh
2014-01-10 14:03:03 +08:00
@guoxx_ ios5 正常哦~~~
GalvinZhao
2014-01-10 17:15:32 +08:00
@fangzhzh 做过了,这段代码没有发现问题
GalvinZhao
2014-01-10 17:23:17 +08:00
@guoxx_
int func(char *read){
//a的值是"abcd|@12345|@efgh|67890"
char *q;
q = a;
while (strsep(&q, symbol));
}
GalvinZhao
2014-01-10 17:24:54 +08:00
@guoxx_q = a; 错了,因该是q = read;
GalvinZhao
2014-01-10 17:30:38 +08:00
@fangzhzh
调用这个func的方法是
func((char *)[parameter cStringUsingEncoding:NSASCIIStringEncoding],recv,result,"|");
parameter也就是read
是 .pch 宏字符串
guoxx_
2014-01-10 18:30:26 +08:00
.pch的宏的话是NSConstantstring, 这个应该就是导致你不能修改这部分内存的原因。
换成动态创建内存的方式
[NSString stringWithString:parameter]或者[NSMutableString stringWithString:parameter]
nil
2014-01-10 22:18:24 +08:00
擦,你确定你在做iOS?
lalawue
2014-01-11 00:26:13 +08:00
楼主那么好的 iOS NSString 类型不用干嘛。。。底层的事情就交给底层去做吧,因为这种错误也许在不同的设备以及平台上原因都有可能不同;如果只是纯研究的话请无视
wezzard
2014-07-01 11:43:54 +08:00
@lalawue 我曾經天真地以爲自己用C處理字符串對比會比NSString快,結果發現我錯了,可能樓主正在這條路上。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/96419

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX