【发布时间】:2016-05-01 00:12:06
【问题描述】:
我用c写了一个小数组程序
#include <stdio.h>
int main()
{
int arr[]={1,2,3,4,5};//int size is 4, elements 5 so size of array = 4*5 = 20
printf("%d\n", sizeof(arr));
return 0;
}
我用
编译了这个gcc -O2 -fverbose-asm -S -c arr_n_pointer_confusion.c
我明白了,
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%d\n"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB22:
.cfi_startproc
pushl %ebp #
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp #,
.cfi_def_cfa_register 5
andl $-16, %esp #,
subl $16, %esp #,
movl $20, 8(%esp) #,
movl $.LC0, 4(%esp) #,
movl $1, (%esp) #,
call __printf_chk #
xorl %eax, %eax #
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE22:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits
任何人都可以将 C 中的汇编步骤联系起来。为什么我要这样做是为了了解一点汇编代码,以便我可以理解指针到数组的区别。
【问题讨论】:
-
有什么问题?如您所见,数组的大小为 20,编译器也是如此。所以它打印 20。没有执行任何指令来达到这个数字。
-
我一直对字符串、数组和指针感到困惑。这就是为什么我想学习 gcc 的汇编。一旦我知道生成的常用汇编代码,我自己就能理解其中的区别。
-
在深入研究机器代码之前,您应该修复您的 C。
sizeof表达式的类型为size_t,需要格式化为%zu。将其传递给%d会导致未定义的行为。 -
@KerrekSB 我也用过 -Wall,没有看到任何警告。
标签: c arrays pointers assembly