c语言。 SetLength,结构数组

时间:2015-04-02 10:32:44

标签: arrays size pascal ansistring

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逻辑?

1 个答案:

答案 0 :(得分:0)

问题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-string的大小,但你可以动态地完成它,而不是在编译时。

(编辑)作为旁注,你应该使用free()释放malloc在你完成时分配的内存。