结构体内字符串指针的问题,请指教

ZhouHM 2003-10-17 08:24:05
typedef struct
{
……
char *notifyURL;
}t_jadStruct;

t_jadStruct *p_jadStruct;

已知p_jadStruct->notifyURL = NULL
当用strlen判断其长度是否为0的时候,返回的是否定值,如下
v_RetCode = ( strlen(p_jadStruct->notifyURL) == 0 )?TRUE:FALSE;
v_RetCode 的值为FALSE;

这是为什么?

...全文
64 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyunet 2003-10-17
  • 打赏
  • 举报
回复
v_RetCode = ( strlen(p_jadStruct->notifyURL) == 0 )?TRUE:FALSE;

strlen(p_jadStruct->notifyURL)等价于 strlen((void*)0);
此时靠看你进程的0地址的内容是什么了,有可能strlen返回0也有可能返回 > 0得数。
由于对于0地址只是做读操作,应该不会引起运行时错误的。

在win32上运行时,会引起访问错误,因为win32对于从0x0到0xffff的地址空间是保护的。
fireinsky 2003-10-17
  • 打赏
  • 举报
回复
呵呵,我试过了,果真是strlen(NULL)不行(windows 2000 pro && vc6),学到知识了
ZhouHM 2003-10-17
  • 打赏
  • 举报
回复
我已经验证了:只有0地址的内容为0时,strlen(NULL)才会返回0,否则返回其后内容连续不为0的存储单元的个数+1;
方法如下:
用一个常数作为strlen的参数,例如strlen(0x1234),找到一个strlen(XXXX)返回不为0的常数,你会发现从xxxx-到xxxx+strlen(xxxx)-1作为strlen的参数返回值递减,而strlen(xxxx+strlen(xxxx))为0
c4313848 2003-10-17
  • 打赏
  • 举报
回复
我也凑热闹测了一下:用的是VC6.0

#include "iostream.h"
#include "string.h"

void main()
{

char *pstr;
char str[10];
pstr = str;
*pstr = NULL;

cout<<" "<<strlen(pstr)<<endl;
}
输出为0。

#include "iostream.h"
#include "string.h"

void main()
{

char *pstr;
char str[10];
pstr = str;
*pstr = NULL;

cout<<" "<<strlen(pstr)<<endl;
}
这样会出现:
---------------------------
Cpp1.exe - 应用程序错误
---------------------------
"0x00403630" 指令引用的 "0x00000000" 内存。该内存不能为 "read"。


要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消
---------------------------
ZhouHM 2003-10-17
  • 打赏
  • 举报
回复
我的程序是用ADS1.2编译的,在arm7的手持设备上运行,程序执行没有报错,只是结果不对(大部分时间不为0)。
问xiaoyunnet:
是否只有0地址的内容为0时,strlen才会返回0,否则返回其后内容连续不为0的存储单元的个数+1
njuhuangmy 2003-10-17
  • 打赏
  • 举报
回复
我 拿 bc31 执行了 10 来次, 都是 0 嘛!!

呵呵, 不知道别的 编译器 怎么样
liupuhua 2003-10-17
  • 打赏
  • 举报
回复
你得的那个结果是随机的。不信,你可以调试一下了。
用vc的f11,好像是。我好久不用那个了。
Hot_Forever 2003-10-17
  • 打赏
  • 举报
回复
指针明明是NULL的,根本就不指向任何东西,你却要求它的strlen,不出错才怪呢
Darkay_Lee 2003-10-17
  • 打赏
  • 举报
回复
不行!str开始的系列函数都不判断NULL的,strlen(NULL)是会导致非法操作的,必须自己先判断,或者自己写个包装函数。再不就是用shlwapi.lib的StrLen函数(Windows Shell and Control API)
njuhuangmy 2003-10-17
  • 打赏
  • 举报
回复
把你的 程序 贴出来阿

我 试了 一下 ,bc31

strlen(NULL) == 0 的!!!

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧