为何以下代码不报错, 求指教。

cauthy628 2010-08-16 01:56:23
class CTest{
public:
char m_cText[20];
}

int main()
{
CTest *p = NULL;
printf("%s\n", p->m_cText);
return 0;
}
...全文
116 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cauthy628 2010-08-16
  • 打赏
  • 举报
回复
那为什么使用第一个char成员就不需要类对象指针地址,而第一个int型的成员就需要呢?
bcj00000 2010-08-16
  • 打赏
  • 举报
回复
1 #include<iostream>
2 #include<stdio.h>
3 using namespace std;
4
5 class CTest{
6 public:
7 char m_cText[20];
8 }
9
10 int main(int argc,char* argv[])
11 {
12 CTest *p = NULL;
13 printf("%s\n", p->m_cText);
14 return 0;
15 }
bcj00000 2010-08-16
  • 打赏
  • 举报
回复
#include<iostream>
#include<stdio.h>
using namespace std;

class CTest{
public:
char m_cText[20];
}

int main()
{
CTest *p = NULL;
printf("%s\n", p->m_cText);
return 0;
}

archlinux
g++ 4.5

tt.cpp:5:1: error: new types may not be defined in a return type
tt.cpp:5:1: note: (perhaps a semicolon is missing after the definition of ‘CTest’)
tt.cpp:10:31: error: two or more data types in declaration of ‘main’
olncy 2010-08-16
  • 打赏
  • 举报
回复
而6楼的问题是和生成的汇编有关的


printf("%s\n", p->m_cText);
1楼的程序生成:
mov eax,dword ptr [p]
push eax
因为m_cText是p对象的第一个成员变量且引用的参数为指针,这里只要把p的指针压入栈即可

printf("%d\n", p->m_nValue);
6楼的程序生成:
mov eax,dword ptr [p]
mov ecx,dword ptr [eax]
push ecx
因为m_nValue为整型值引用的参数为整型,所以必需要从p对象指针获得m_nValue值,但引用的指针为0出错了.


同理引申,如果1楼的m_cText成员不是第一个的话也会出错的
Jim_King_2000 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cauthy628 的回复:]

那为何下面这个却会报错
class CTest{
public:
int m_nValue;
};

int main()
{
CTest *p = NULL;
printf("%s\n", p->m_nValue);
return 0;
}
[/Quote]
这个程序也是能正常编译的。但运行时就不确定了。有可能正常运行,有可能crash。是个未定义行为。
herman~~ 2010-08-16
  • 打赏
  • 举报
回复
mark 指针乱飞,呵呵
cauthy628 2010-08-16
  • 打赏
  • 举报
回复
%s 变成 %d
olncy 2010-08-16
  • 打赏
  • 举报
回复
因为p->m_cText == 0
在printf函数里有检查空指针

printf函数:

......
if (text.sz == NULL) /* NULL passed, use special string */
text.sz = __nullstring;
......

cauthy628 2010-08-16
  • 打赏
  • 举报
回复
那为何下面这个却会报错
class CTest{
public:
int m_nValue;
};

int main()
{
CTest *p = NULL;
printf("%s\n", p->m_nValue);
return 0;
}
GARY 2010-08-16
  • 打赏
  • 举报
回复
确实不报错
写代码的时候要小心
Jim_King_2000 2010-08-16
  • 打赏
  • 举报
回复
C/C++语言很纵容程序员的。非法访问都是不报错的。甚至有时候运行时也不报错。这就是为什么缓冲区溢出漏洞常常能被人利用来运行任意代码。
yzx714 2010-08-16
  • 打赏
  • 举报
回复
Segmentation fault
这还是加上分号过后
xy_zhang 2010-08-16
  • 打赏
  • 举报
回复
class结束的大括号后少个分号。

输出(null),不懂……
taodm 2010-08-16
  • 打赏
  • 举报
回复
去看《深度探索C++对象模型》

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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