得到错误,而在三分球

问题描述:

调试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; 
} 

the gdb error highlighted in black??

我无法理解的错误,应该怎么代码进行修改。

+2

你没”让调试器执行第8行。我想这就是你得到这个错误的原因。 – Gaurav

+0

是的,这是有效的。谢谢。我不知道断点是如何工作的。 –

+0

您需要将'* ptr - a'转换为'int',因为生成的类型为'ptrdiff_t':http://ideone.com/CfjqzO另外'*'在'* ptr ++;'中是不必要的。 – mch

你还没有执行gdb中的第8行。

8 int **ptr = p; 

因此,直到现在ptr尚未在您的程序中定义。因此,无法访问它。你可以在gdb提示按n命令,然后由print

(gdb) n 
(gdb) print *ptr 

遵循同样,你的程序应该有%ld而不是%dprintf作为格式说明沉默编译器警告在

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'。 –