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,结构数组的主要内容,如果未能解决你的问题,请参考以下文章

c语言中返回结构体数组

c语言结构体类型数组长度

C语言遍历结构体数组

C语言中用结构体数组来接收结构体数组

C语言结构体数组 的输入方式

C语言如何返回结构体数组