社区
C语言
帖子详情
结构体内字符串指针的问题,请指教
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
打赏
收藏
结构体内字符串指针的问题,请指教
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; 这是为什么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 的!!!
C面试题
(
请
至少说明两种) 1.限制变量的作用域 2.设置变量的存储域 7. 引用与
指针
有什么区别? 1) 引用必须被初始化,
指针
不必。 2) 引用初始化以后不能被改变,
指针
可以改变所指的对象。 2) 不存在指向空值的引用...
C面试题目
(
请
至少说明两种)1.限制变量的作用域2.设置变量的存储域7. 引用与
指针
有什么区别?1) 引用必须被初始化,
指针
不必。2) 引用初始化以后不能被改变,
指针
可以改变所指的对象。2) 不存在指向空值的引用,但是存在...
C语言编程入门知识
1、数据类型 (1)整型 可用int(4个字节)、short(2个字节)、long...注:C语言中没有
字符串
类型的数据,在C语言中遇到
字符串
是将其当作字符数组进行处理 C语言规定sizeof(long) >= sizeof(int) 2、变量 ...
C语言
结构体
里的成员数组和
指针
上面代码中,test结构中i和p
指针
,在C的编译器中保存的是相对地址——也就是说,他们的地址是相对于struct test的实例的。如果我们有这样的代码: 1 struct test t; ...
C++笔试题汇总(6)
了试题4 的
问题
,传入GetMemory 的参数为
字符串
指针
的
指针
,但是在GetMemory 中执 行申
请
内存及赋值语句*p = (char *) malloc( num ); 后未判断内存是否申
请
成功,应加 上:if ( *p == NULL ){ ...//进行申
请
内存...
C语言
69,335
社区成员
243,078
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章