得到错误,而在三分球
问题描述:
调试C程序下面是C代码:得到错误,而在三分球
#include<stdio.h>
int main()
{
int a[]={0,1,2,3,4};
int*p[]={a,a+1,a+2,a+3,a+4};
int**ptr=p;
ptr++;
printf("%d , %d ",*ptr-a , **ptr);
*ptr++;
printf("\n%d , %d ",*ptr-a , **ptr);
*++ptr;
printf("\n%d , %d ",*ptr-a , **ptr);
++*ptr;
printf("\n%d , %d ", *ptr-a , **ptr);
return 0;
}
我无法理解的错误,应该怎么代码进行修改。
答
你还没有执行gdb中的第8行。
8 int **ptr = p;
因此,直到现在ptr
尚未在您的程序中定义。因此,无法访问它。你可以在gdb提示按n
命令,然后由print
(gdb) n
(gdb) print *ptr
遵循同样,你的程序应该有%ld
而不是%d
在printf
作为格式说明沉默编译器警告在
printf("%ld , %ld ",*ptr-a , **ptr);
答
将%d替换为%ld,那么它应该工作正常。
你可以参考format specifiers details进一步澄清这一点。
+3
'* ptr - a'产生一种'ptrdiff_t'类型。 ''%ld“'是'long'。自C99以后,应该使用'“%td”'。 – chux
+1
也值得推荐在编译命令(或者更好的,'-Wall -Wextra')中添加'-Wformat'。 –
你没”让调试器执行第8行。我想这就是你得到这个错误的原因。 – Gaurav
是的,这是有效的。谢谢。我不知道断点是如何工作的。 –
您需要将'* ptr - a'转换为'int',因为生成的类型为'ptrdiff_t':http://ideone.com/CfjqzO另外'*'在'* ptr ++;'中是不必要的。 – mch