0
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);

How to imitate Pascal logic in C language? Next code does not work:

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");
}

QUESTION 1

I get compiler error error C2106: '=' : left operand must be l-value. What should I do to imitate Pascal logic in case of SetLength?

QUESTION 2

How to specify a string of unknown size (Ansistrings is Pascal). When I set char FN[]; I get error error C2229: struct '<unnamed-tag>' has an illegal zero-sized array . What should I do to imitate Pascal logic in case of Ansistring?

4

1 回答 1

0

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

问题 2:据我所知,唯一合适的类型是 c-string。在这种情况下,解决方案类似于问题一中的解决方案,将FN[]和更改RN[]*FN*RN。然而,我对 C 语言不是很有经验,这可能不是处理事情的最有效方式,尤其是从那时起,我相信结构不会占用连续的内存空间。另一个问题是您仍然需要在某些时候指定 c-string 的大小,但是您将能够动态地完成它,而不是在编译时。

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

于 2015-04-02T10:49:57.550 回答