问题描述
"我遇到了一些声明这样结构的代码:
struct name {
int namelen;
char namestr [1];
};
然后做了一些棘手的分配,使namestrc数组的行为像它有的那样
几个元素。
究竟是什么样的棘手的分配常见问题解答是什么?
-
Christopher Benson-Manica | Jumonji giri,荣誉。
ataru(at)cyberspace.org |
"I came across some code that declared a structure like this:
struct name {
int namelen;
char namestr[1];
};
and then did some tricky allocation to make the namestr array act like it had
several elements."
Exactly what kind of "tricky allocation" is the FAQ talking about?
--
Christopher Benson-Manica | Jumonji giri, for honour.
ataru(at)cyberspace.org |
推荐答案
你可以去:
struct name * n = malloc(sizeof(int)+ 50);
,方便地给你一个
结构名称{
int namelen;
char namestr [50];
};
变量,因为C中没有边界检查。至少,那个'我是怎么做的。
这样做。我认为这是错误的,因为场填充,但是只要你在namestr之前保留所有的字段,它就不会打扰我[]
32在32位机器上的位。
Matt Gregory
You can go:
struct name *n = malloc(sizeof(int) + 50);
and that conveniently gives you a
struct name {
int namelen;
char namestr[50];
};
variable since there''s no bounds checking in C. At least, that''s how I
do it. I suppose that''s wrong though because of field padding, but it''s
never bothered me as long as you keep all the fields before namestr[]
32 bits on a 32-bit machine.
Matt Gregory
为结构分配内存加:
struct name * ptr;
ptr = malloc(offsetof(struct name,namestr)+ strlen(name)+ 1);
assert(ptr!= NULL);
ptr-> namelen = strlen(name);
strcpy(ptr-> namestr,name);
这个闪避早已为人所知作为结构黑客,并且它的使用被描述为依赖于无理的chumminess
与编译器。 C99引入了一种新的语法,允许以支持的方式完成
相同的结束。
如果您原谅基于这个问题的观察
和管理员Contrived casting situation线程:停止
这些东西四处乱窜,至少目前如此。 C让它很容易偷看,初学者可以理解
感兴趣这样做 - 知道引擎发生了什么
让人感觉更像是专家。但它并没有让一个更好的司机!首先学习如何驾驶,如何使用踩踏板,如何在交通中做出正确的判断。返回
到C条款,这意味着你应该专注于你操纵的价值
,而不是计算机代表的价值
他们。仔细研究这些表达会让你陷入像知道那样的陷阱。一个'int''是四个八位字节,
或一个'void *''和一个'long''是可以互换的。不要去那里
。
现在,一旦你真的把我们称为
"官方"或抽象或抽象 C语言,它可能是有意义的
注意不同的实现如何代表你的程序使用的
值 - 你将是一个稍好的驱动程序
如果你知道如何更换破损的风扇皮带,如果你了解不同的b / b
方式,那么你将会是一个稍好的C程序员其中各种C实现安排内存。但
这样的知识相对来说真的很少需要(风扇带
相当耐用),部分知识可能很危险
(更换皮带)电机运行调用未定义
行为)。坚持使用必需品并忘记技巧 -
为nonce,至少。
-
嘿,没有冒犯...幸运的是,我不打算写*真正的*代码
那个看起来像那样;)我只是好奇......那就是我在这里的原因!
-
Christopher Benson-Manica | Jumonji giri,荣誉。
ataru(at)cyberspace.org |
Heh, no offense taken... Fortunately, I don''t intend to write *real* code
that looks like that ;) I was just curious... That''s why I''m here!
--
Christopher Benson-Manica | Jumonji giri, for honour.
ataru(at)cyberspace.org |
这篇关于常见问题2.6的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!