我最近读到在C中使用灵活的阵列成员是糟糕的软件工程实践.但是,该声明没有任何论据支持.这是公认的事实吗?
(灵活的数组成员是C99中引入的C特性,其中可以将最后一个元素声明为未指定大小的数组.例如:)
struct header {
size_t len;
unsigned char data[];
};
Run Code Online (Sandbox Code Playgroud) 我一直在考虑使用共享指针,我知道如何自己实现它 - 不想这样做,所以我在尝试std::tr1::shared_ptr,我有几个问题......
引用计数是如何实现的?它是否使用双向链表?(顺便说一句,我已经用Google搜索了,但我找不到任何可靠的东西.)
使用它有任何陷阱std::tr1::shared_ptr吗?
假设你有 -
struct Person {
char *name;
int age;
int height;
int weight;
};
Run Code Online (Sandbox Code Playgroud)
如果你这样做 -
struct Person *who = malloc(sizeof(struct Person));
Run Code Online (Sandbox Code Playgroud)
C如何知道为name变量分配多少内存,因为这可以容纳大量的数据/字符串?我是C的新手并且对内存分配感到困惑.
我正在开发一个程序,它将一个重要的数据结构存储为一个带有程序定义分隔符的非结构化字符串(所以我们需要遍历字符串并提取我们需要的信息)并且我们想将它转换为更结构化的数据类型.
本质上,这将需要一个结构,其中一个字段描述结构包含哪种数据,另一个字段是一个包含数据本身的字符串.在分配时始终知道字符串的长度.我们通过测试确定,每种数据类型所需的分配数量加倍是不可接受的成本.有没有办法在单个分配中为结构和结构中包含的std :: string分配内存?如果我们使用cstrings,我只需要在struct中有一个char*,并在为块和字符串分配足够大的块之后将其指向结构的末尾,但是如果可能的话我们更喜欢std :: string.
我的大部分经验都是使用C,所以请原谅这里显示的任何C++无知.
我正在看一下FastCopy的代码.我想添加一些选项,以便将文件删除到回收站而不是永久删除.
我遇到的第一个问题是存储路径的方式 - 作为一种BYTE[1]类型.我认为它可能是一些指向真实路径的指针,但可能不是它只是一个字节.请参阅下面的完整结构:
struct MoveObj {
_int64 fileID;
_int64 fileSize;
enum Status { START, DONE, ERR } status;
DWORD dwFileAttributes;
BYTE path[1];
};
Run Code Online (Sandbox Code Playgroud)
知道这是什么意思吗?
我的第二个问题是我需要将此字符串转换为一些名为"PCZZTSTR"的可怕MS类型,以便它可以与SHFILEOPSTRUCT结构一起使用.有什么建议我怎么做这个转换?
这与这个问题非常相似,但答案并没有真正回答这个问题,所以我想我再问一遍:
有时我会与返回可变长度结构的函数进行交互; 例如,FSCTL_GET_RETRIEVAL_POINTERS在Windows中返回可变大小的RETRIEVAL_POINTERS_BUFFER结构.
在C++中不鼓励使用malloc/ free,所以我想知道:
在标准C++中分配可变长度缓冲区的"正确"方法是什么(即没有Boost等)?
vector<char>是类型不安全的(如果我理解的话,不保证对齐的任何内容),new不适用于自定义大小的分配,我想不出一个好的替代品.有任何想法吗?
我需要制作一个包含头部,尾部和可变长度有效载荷字段的数据包.到目前为止,我一直在使用向量作为有效负载,所以我的结构设置如下:
struct a_struct{
hdr a_hdr;
vector<unsigned int> a_vector;
tr a_tr;
};
Run Code Online (Sandbox Code Playgroud)
当我尝试访问向量的成员时,我得到一个seg错误,整个结构的sizeof给我32(在我向向量添加了大约100个元素之后).
这是一个好方法吗?什么是更好的?
我发现这篇文章 变量大小的结构C++ 他使用了一个char数组,但我正在使用一个向量.