Arrays c语言。SetLength,结构数组

Arrays c语言。SetLength,结构数组,arrays,size,pascal,ansistring,Arrays,Size,Pascal,Ansistring,如何在C语言中模仿Pascal逻辑? 下一个代码不起作用: 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';

如何在C语言中模仿Pascal逻辑? 下一个代码不起作用:

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);
问题1

我得到编译器错误
错误C2106:“=”:左操作数必须是l值
。在设置长度的情况下,我应该如何模仿Pascal逻辑

问题2

如何指定未知大小的字符串(Ansistrings是Pascal)。当我设置
char FN[]时我得到错误
错误C2229:结构“”具有非法的零大小数组
。在回答问题时,我应该如何模仿Pascal逻辑?

问题1: malloc()返回一个void指针(void*),所以我认为Sy应该是指针类型。最直接的方法是将
TS Sy[]
更改为
TS*Sy
。然后,在使用malloc时,需要将指针强制转换为TS指针,如下所示: Sy=(TS*)malloc(2*sizeof(TS))

问题2: 据我所知,唯一合适的类型是c字符串。在这种情况下,解决方案与问题1类似,将
FN[]
RN[]
更改为
*FN
*RN
。然而,我对C不是很有经验,这可能不是处理事情的最有效的方法,特别是从那时起,我相信结构不会占用连续的内存空间。另一个问题是,您仍然需要在某个时候指定c字符串的大小,但是您可以动态地指定,而不是在编译时指定


(编辑)作为旁注,您还应该使用free()来释放malloc分配的内存

正如我在OllyDBG中看到的,VisualStudio在这两种情况下都生成相同的代码
Sy=(TS*)malloc(2*sizeof(TS))
Sy=malloc(2*sizeof(TS))。所以不需要类型转换,必须是C,而不是C++?C++至少有STD::Stru.它必须是ANSI C,而不是C++ .正如我在调试器中看到的,Pascal的SETFLUM(SY,2)将分配6个DWord的内存:01、00、00、00、01、00、00 00、00、00、00、α、y、β、y、β、β、β、y、y、y、y、y、y、y、y、y、y、y、y、y、y、y、y、y、y、y、c、s。第一个dword总是$00000001(小Endian订单)(我不知道它的用途)。第二个dword是减少1的元素数。第三个是Sy[0].FN地址(字符串上的指针,将在FN中推送)。第四个是Sy[0]。RN地址。第五个是Sy[1]。FN地址。第六个是Sy[1]。RN地址。Pascal的长度(Sy)将只接收分配的6个dword的地址作为参数,增加4(所以它是第二个dword),提取值,增加1。所以为了模拟Pascal逻辑,我必须将数组的长度推到元素[-1](dword表示法)上。这可以通过下一个C语言代码来完成:Sy=calloc(sizeof(TS)*NU sizeof(unsigned long int),1);Sy=&((无符号长整型*)Sy)[1];((无符号长整型*)Sy)[-1]=nuu;
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");
}