本文介绍了常见问题2.6的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时删除!!

"我遇到了一些声明这样结构的代码:


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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-08 18:57