对于第二个错误:printf("%d\t",&a[i]); 实际上应该是 printf("%d\t",a[i]);。 & 表示“地址”,但您需要该值。
但是,register 变量的数组索引不起作用,因为...
来自Wikipedia:
在 C 中(但不是 C++,其中关键字基本上被忽略)无法访问使用 register 声明的变量的位置,但可以应用 sizeof 运算符。除了这个限制之外,寄存器在现代编译器中基本上没有意义,因为优化会在适当的时候将变量放在寄存器中,而不管是否给出提示。
因此,对于第一个错误,您不能拥有使用指针算法的代码,例如 *(a+i)=1;,这可能是编译器实现 a[i]=1; 的方式。展开循环似乎可以工作:
int main(int argc, char *argv[]) {
register int a[10];
a[0]=1;
a[1]=1;
a[2]=1;
a[3]=1;
a[4]=1;
a[5]=1;
a[6]=1;
a[7]=1;
a[8]=1;
a[9]=1;
printf("%d\t", a[0]);
printf("%d\t", a[1]);
printf("%d\t", a[2]);
printf("%d\t", a[3]);
printf("%d\t", a[4]);
printf("%d\t", a[5]);
printf("%d\t", a[6]);
printf("%d\t", a[7]);
printf("%d\t", a[8]);
printf("%d\t", a[9]);
printf("\n");
}
>gcc -S -std=c11 -Wall -c main.c && gcc main.o -o main.exe && main
1 1 1 1 1 1 1 1 1 1
; ...
movl %ecx, 16(%rbp)
movq %rdx, 24(%rbp)
call __main
movl $1, -48(%rbp)
movl $1, -44(%rbp)
movl $1, -40(%rbp)
movl $1, -36(%rbp)
movl $1, -32(%rbp)
movl $1, -28(%rbp)
movl $1, -24(%rbp)
movl $1, -20(%rbp)
movl $1, -16(%rbp)
movl $1, -12(%rbp)
movl -48(%rbp), %eax
movl %eax, %edx
leaq .LC0(%rip), %rcx
call printf
movl -44(%rbp), %eax
movl %eax, %edx
leaq .LC0(%rip), %rcx
call printf
; ...
但请注意,值已移至RBP!中包含的地址!
最简单的解决方案(可能是可读性、可维护性和编译器优化的最佳解决方案):删除 register 关键字!
int main(int argc, char *argv[]) {
int a[10];
int i;
for(i=0;i<10;i++){
a[i]=1;
}
for(i=0;i<10;i++){
printf("%d\t", a[i]);
}
printf("\n");
}
; ...
movl %ecx, 16(%rbp)
movq %rdx, 24(%rbp)
call __main
movl $0, -4(%rbp)
jmp .L2
.L3:
movl -4(%rbp), %eax
cltq
movl $1, -48(%rbp,%rax,4)
addl $1, -4(%rbp)
.L2:
cmpl $9, -4(%rbp)
jle .L3
movl $0, -4(%rbp)
jmp .L4
.L5:
movl -4(%rbp), %eax
cltq
movl -48(%rbp,%rax,4), %eax
movl %eax, %edx
leaq .LC0(%rip), %rcx
call printf
addl $1, -4(%rbp)
.L4:
cmpl $9, -4(%rbp)
jle .L5
; ...
>gcc -std=c11 -Wall -c main.c && gcc main.o -o main.exe && main
1 1 1 1 1 1 1 1 1 1