c语言。 SetLength,结构数组
Posted
技术标签:
【中文标题】c语言。 SetLength,结构数组【英文标题】:c language. SetLength, array of structs 【发布时间】:2015-06-07 06:40:18 【问题描述】:type
TS = record
FN, RN: String;
end;
var
Sy: array of TS;
S: ^String;
...
SetLength(Sy,2);
begin
Sy[0].FN:='123';
Sy[0].RN:='bad';
Sy[1].FN:='345';
Sy[1].RN:='000';
end;
...
S := @(Sy [i].FN);
如何在C语言中模仿Pascal逻辑? 下一个代码不起作用:
typedef struct
char FN[256];//char FN[] /*isn't allowed by compiler*/
char RN[256];//char RN[] /*isn't allowed by compiler*/
TS;
TS Sy[];
main()
Sy=malloc(2*sizeof(TS));
strcpy(Sy[1].FN,"1234");
问题 1
我收到编译器错误error C2106: '=' : left operand must be l-value
。在SetLength的情况下我应该如何模仿Pascal逻辑?
问题 2
如何指定一个未知大小的字符串(Ansistrings 是 Pascal)。当我设置 char FN[];
我得到错误 error C2229: struct '<unnamed-tag>' has an illegal zero-sized array
。在Ansistring的情况下我应该如何模仿Pascal逻辑?
【问题讨论】:
必须是纯 C,而不是例如C++? C++ 至少有 std::string。 它必须是 ANSI C。不是 C++。 正如我在调试器中看到的,Pascal 的 SetLength(Sy,2) 将分配 6 个 dwords 的内存:01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00。第一个 dword 始终是 $00000001(小端序)(我不知道它的用途)。第 2 个 dword 是减 1 的元素数。第 3 个是 Sy[0].FN 地址(字符串上的指针,将被压入 FN)。第 4 个是 Sy[0].RN 地址。第 5 个是 Sy[1].FN 地址。第 6 位是 Sy[1].RN 地址。而 Pascal 的 Length(Sy) 只会接收分配的 6 个 dword 的地址作为参数,将其增加 4(因此它是第 2 个 dword),提取值,将其增加 1。 所以要模仿 Pascal 逻辑,我必须将数组的长度推送到元素 [-1](以 dword 表示法)。 可以通过下一个C语言代码来完成: Sy=calloc(sizeof(TS) * nuu + sizeof(unsigned long int),1); Sy=&((unsigned long int*)Sy)[1]; ((unsigned long int*)Sy)[-1] = nuu; 【参考方案1】:问题 1:
malloc() 返回一个 void 指针 (void*),所以我认为 Sy 需要是一个指针类型。最直接的方法是将TS Sy[]
更改为TS *Sy
。然后在使用 malloc 时,您需要将指针转换为 TS 指针,如下所示:
sy = (TS*)malloc(2*sizeof(TS));
问题 2:
据我所知,唯一合适的类型是 c 字符串。在这种情况下,解决方案与问题一类似,将FN[]
和RN[]
更改为*FN
和*RN
。但是,我对 C 的经验不是很丰富,这可能不是处理事情的最有效方式,尤其是从那时起,我相信结构不会占用连续的内存空间。另一个问题是您仍然需要在某些时候指定 c-string 的大小,但您将能够动态地完成它,而不是在编译时。
(编辑)作为旁注,您还应该使用 free() 来释放 malloc 分配的内存,当您完成它时。
【讨论】:
正如我在 OllyDBG 中看到的,Visual Studio 在Sy = (TS*)malloc(2*sizeof(TS));
和Sy = malloc(2*sizeof(TS));
两种情况下生成相同的代码。所以不需要类型转换。以上是关于c语言。 SetLength,结构数组的主要内容,如果未能解决你的问题,请参考以下文章