int i; int count = 0; char * fred (char c, int i) { static int mark = 0; char * result = (char *) malloc (i + 2); count += i; { int k; for (k = 0; k < i; k++) result [k] = c; } result [i++] = 0; result [i] = ++mark; return result; } int main (void) { char * string; i = 5; string = fred ('a', i); printf ("%s, %d, %d\n", string, string [i+1], count); string = fred ('b', i); printf ("%s, %d, %d\n", string, string [i+1], count); return 0; }
char type 0 1 byteint type 0 4 bytes
i var 1 1 int
count var 1 2 int 0
fred fun 1 ? char*
c param 2 1 char
param 2 2 int
mark var 2 1 static int 0
result var 2 2 char*
malloc fun? 1? ? ?
k var 3 1 int
main fun 1 ? int
string var 2 1 char*
int iint count 0
char*() fred () char c int i {} st.int mark 0 char* result (char*) malloc + i 2 += count i {} int k for = k 0 < k i post++ k = [] result k c = [] result post++ i 0 = [] result i pre++ mark return result
int() main () void {} char* string = i 5 = string fred 'a' i printf "%s, %d, %d\n" string [] string + i 1 count = string fred 'b' i printf "%s, %d, %d\n" string [] string + i 1 count return 0
; generated by Norcroft ARM C vsn 4.66d ; (ARM Toolkit v2.02) [Feb 5 1996] AREA C$$code, CODE, READONLY x$codeseg DATA fred MOV ip,sp STMDB sp!,{v1,v2,fp,ip,lr,pc} SUB fp,ip,#4 CMP sp,sl BLMI __rt_stkovf_split_small MOV v1,a2 AND v2,a1,#&ff ADD a1,a2,#2 ; start of user code BL malloc LDR a3,[pc, #L74-.-8] LDR a2,[a3,#4] ADD a2,a2,v1 STR a2,[a3,#4] MOV a2,#0 CMP v1,#0 BLE L50.J5 L40.J4 STRB v2,[a1,a2] ADD a2,a2,#1 CMP a2,v1 BLT L40.J4 L50.J5 MOV a4,#0 MOV a2,v1 ADD v1,v1,#1 STRB a4,[a1,a2] LDR a2,[a3,#8] ADD a2,a2,#1 STR a2,[a3,#8]! STRB a2,[a1,v1] ; end of user code LDMDB fp,{v1,v2,fp,sp,pc} L74 DCD x$dataseg main MOV ip,sp STMDB sp!,{v1,fp,ip,lr,pc} SUB fp,ip,#4 CMP sp,sl BLMI __rt_stkovf_split_small MOV a2,#5 ; start of user code LDR v1,[pc, #L74-.-8] MOV a1,#&61 STR a2,[v1,#0] BL fred MOV a2,a1 LDR a3,[v1,#0] ADD a1,a1,a3 LDRB a3,[a1,#1] LDR a4,[v1,#4] ADD a1,pc,#Lec-.-8 BL printf MOV a1,#&62 LDR a2,[v1,#0] BL fred MOV a2,a1 LDR a3,[v1,#0] ADD a1,a1,a3 LDRB a3,[a1,#1] LDR a4,[v1,#4]! ADD a1,pc,#Lec-.-8 BL printf MOV a1,#0 ; end of user code LDMDB fp,{v1,fp,sp,pc} Lec DCB 0x25,0x73,0x2c,0x20 DCB 0x25,0x64,0x2c,0x20 DCB 0x25,0x64,0x0a,00 AREA C$$data,DATA x$dataseg i DCD 00000000 count DCD 00000000 DCD 00000000 EXPORT main EXPORT fred EXPORT count EXPORT i IMPORT printf IMPORT malloc IMPORT __rt_stkovf_split_small END