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逻辑?
答案 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在你完成时分配的内存。