社区
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;
这是为什么?
...全文
68
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面试题
4. static有什么用途?(
请
至少说明两种) 1.限制变量的作用域 2.设置变量的存储域 7. 引用与
指针
有什么区别? 1) 引用必须被初始化,
指针
不必。 2) 引用初始化以后不能被改变,
指针
可以改变所指的对象。 2) 不存在指向空值的引用,但是存在指向空值的
指针
。 8. 描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性 9.
C面试题目
C语言面试题总汇 4. static有什么用途?(
请
至少说明两种)1.限制变量的作用域2.设置变量的存储域7. 引用与
指针
有什么区别?1) 引用必须被初始化,
指针
不必。2) 引用初始化以后不能被改变,
指针
可以改变所指的对象。2) 不存在指向空值的引用,但是存在指向空值的
指针
。 8. 描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性9. 全局变量和局部变量
C语言编程入门知识
1、数据类型 (1)整型 可用int(4个字节)、short(2个字节)、long(4或8个字节)、long long(8个字节)进行定义声明。 (2)浮点型 可用float(4个字节)、double(8个字节)进行声明定义。 (3)字符数据类型 可用char(1个字节)进行声明定义。 注:C语言中没有
字符串
类型的数据,在C语言中遇到
字符串
是将其当作字符数组进行处理 C语言规定sizeof(long) >= sizeof(int) 2、变量 ...
C语言
结构体
里的成员数组和
指针
2014年4月1日陈皓 发表评论阅读评论 23,998 人阅读 单看这文章的标题,你可能会觉得好像没什么意思。你先别下这个结论,相信这篇文章会对你理解C语言有帮助。这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接。微博截图如下。我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章。 为了方便你把代码copy过去编译和调试,我把
C++笔试题汇总(6)
1.引言本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分 析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。 许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最 简单的strcpy 函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个 strcpy 函数吗?我们都觉得自己能,可是我们写出的strcpy 很可能只能拿到10 分中的2 分。 读者可从本文看到strcpy 函数从2 分到1
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章