高分求解基本的C/C++语法问题!(最高我可以加到100分,绝不食言)

spirix 2001-05-21 10:30:00
struct name_a
{
int a;
int b[];// char b[];
inline void f(void)
{;}
};

在结构体name_a中,b代表什么?sizeof(name_a)=多少?
在程序中定义
name_a A;
如果变量A的首地址是x那么,请表示A.a的地址,A.b表示的地址,函数指针的地址?
A.b[0]表示什么,A.b[1]呢?
(假设现在是在DOS下编译int 占两个byte,char 是一个byte)
同时如上所示,如果是定义char b[]而不是int b[]时候,情况会有根本的变化吗?
同时如上所示,如果是定义char b[]而不是int b[]时候,情况会有根本的变化吗?
...全文
3074 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
fooker 2001-05-31
  • 打赏
  • 举报
回复
???
zminhao 2001-05-31
  • 打赏
  • 举报
回复
关注
tohigh 2001-05-30
  • 打赏
  • 举报
回复
A.a,A.b,函数指针的地址都为x。
ploto 2001-05-30
  • 打赏
  • 举报
回复
b是一个指针,它应该只占用4个字节的。
dxhjlu 2001-05-30
  • 打赏
  • 举报
回复
显然,sizeof(name_a)是一个不定值,这本身就是一个错误的定义,首先,int 型是2个字节,而你的数组是一个不定的数组,在他还没有被初始化之前时石不知道他的大小,所以,根本测试不出它的大小。另外我想说明一点,指针与数组的定义是有差别的,其实,仅仅在 b 的首地址是与指针相同,但是这仅仅在名称上可以通用,其实,并不是真真相同。应该这样说:指针就是地址,但是数组的第一项也可以用作地址,但何止真是有区别的,所以,根本上讲,你的大小是测不出来的,不过你可以用指针来实现你的功能,他比数组的功能更为强大。最好不要用数组!这是我的经验!!
spirix 2001-05-30
  • 打赏
  • 举报
回复
各位可以Down一个候捷先生翻译的 <<C++ Inside object model>>[深度探索 C++ 对象模型],上面对C++类对象的内存布局有比较详细的讲解,相信大家看过后都会对C++的对象结果有个比较清楚的认识了!
<<C++ Inside object model>>[深度探索 C++ 对象模型]的电子书的下载网址: http://www.jjhou.com/inside-the-cpp-object-model.pdf ,希望大家都能从其中都学到一些东西!同时,如果你在看后有什么体会或疑问,不妨都提出来,我们大家一起讨论共同提高!
jimsuker 2001-05-28
  • 打赏
  • 举报
回复
sizeof(name_a) = 10
a是int ,16位//
b是指针,32位
f是指向函数的指针,32位
如果是定义char b[]而不是int b[]时候,以上情况不会有根本的变化
如果变量A的首地址是x那么,A.a的地址是x,A.b表示的地址是b[0]的地址,函数指针的地址是x+6。
huzhiyan11111 2001-05-28
  • 打赏
  • 举报
回复
joe_fox1025(joe_fox):
在C中当然可以实现 把函数也封装到结构体中,用C可以实现部分的面向对象的功能
c中可以这样写:
struct struct_name{
int a;
int b;
int (* fp)(int pa1,int pa2);
}
函数

int add ( int pa1, int pa2)
{
}
使用:
struct struct_name cstruct[] ={
{ ,,,},
{ ,,,},
{ ,,,}
}
spirix 2001-05-25
  • 打赏
  • 举报
回复
to 楼上的兄弟:
在类中,函数是不占有空间的。编译器为每个类都建立一个表,表明了类函数的入口地址,所以在具体的类的实例中,所有实例函数实际上只有一个版本,函数是不占空间的!
如果是在Dos下,sizeof(name_a)=2,如果是在32位windows中, sizeof(name_a)=4!(int型在Dos下占2 bytes; windows下占 4 bytes)
reinly 2001-05-24
  • 打赏
  • 举报
回复
各位高手:
小生是最近才开始学习C/C++的,没有什么实践经验,如果书上说的是对的话,那么sizeof(name_a)应该等于0,因为声明一个结构,编译器,并不为其分配内存。如果是使用该结构的话
我想应该是6字节。两个int型占用4字节,另外两个字节是对void函数的引用。
不知道我说的对不对,请指教!!!!!
joe_fox1025 2001-05-24
  • 打赏
  • 举报
回复
我当然知道在C++中提供了类的封装了,只是没见过在C中这么用的,看来果然是不通呀, 谢谢指教!
marmoset 2001-05-24
  • 打赏
  • 举报
回复
请看MSDN中关于sizeof的一句注释:
If an unsized array is the last element of a structure, the sizeof operator returns the size of the structure without the array.
在VC里,如果把结构name_a中的成员a和b调换一下顺序或者在b的后面加一些其它成员,编译就不会通过(将会导致错误C2229: struct 'name_a' has an illegal zero-sized array)。

我想这个问题应该和编译环境有很大的关系,不过总体来说,象int b[];这样的声明,即使编译能通过,恐怕也不会被分配空间的。

另外,很多编译器对struct,class,和union的空间分配进行了一定程度的优化,比如一个结构里包含一个4byte的成员,但有的编译器可能为了效率的原因一次性的分配8byte,这些都是因编译器而异的事情。
xiangya 2001-05-24
  • 打赏
  • 举报
回复
继续:
spirix 2001-05-24
  • 打赏
  • 举报
回复
To 楼上的兄弟:
如果是在C中,的确是不可以这样,但是在C++中,完全是可以的的!
下面的结构体:
struct name_a
{
int a;
int b[];// char b[];
inline void f(void)
{;}
};
相当于:
class name_a
{
public:
int a;
int b[];// char b[];
inline void f(void)
{;}
};
你理解了吗?
希望大家继续讨论!



jy 2001-05-24
  • 打赏
  • 举报
回复
ANSI C++下,
A.a x
A.b x + sizeof(int)
函数指针?有函数指针吗?inline函数被展开到引用之处,根本不具备函数形态,没有地址。

讨论没意义,结论是,不推荐这种书写法。不同平台,不同编译器,不同编译选项可以导致不同结果(对于A.b[xxx]进行讨论的话)
对于A.b也没有标准答案,结构成员存储存在对齐问题,ANSI C++会按字节对齐,但是ANSI C++同时又允许编译选项调整对齐到其他尺寸:对于x86平台这个尺寸应该是2的冥次。
如果是VC++debug模式,则f()等同于一个标准函数,这时存在入口地址,但是地址和x毫无关系。

唯一应该用到b[]成员的场合,是需要表示变长结构时(即Pascal之变体记录<?>)。并且,变长结构只能是最后一个成员的尺寸未知。不能有多个变长成员。
这种情况,会推荐BYTE* b或者char* b的写法。
joe_fox1025 2001-05-24
  • 打赏
  • 举报
回复
请问这个问题的提出者一个与你问题不是很有关系的问题,在结构体中可以象c++那样把函数也封装到结构体中吗?
wagnerwash 2001-05-23
  • 打赏
  • 举报
回复
请不要用VC来试,VC is NOT ANSI C++!!!
joe_fox1025 2001-05-23
  • 打赏
  • 举报
回复
大开眼界!
spirix 2001-05-23
  • 打赏
  • 举报
回复
各位讨论的相当激烈,我继续关注,希望有更多的意见!
hornedreaper 2001-05-23
  • 打赏
  • 举报
回复
多出了个1是C++强制在空的结构中填了个哑成员,因为每个对象必须有一个地址用以相互区别,否则...
加载更多回复(36)

69,382

社区成员

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

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