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