C 为什么指针值有时是负数?

C 为什么指针值有时是负数?,c,pointers,gdb,C,Pointers,Gdb,我尝试了《理解和使用C指针》(Reese)一书中的以下代码示例,该示例演示了如何将二维数组指针传递给函数: void display2DArray(int arr[][5], int rows) { for (int i = 0; i<rows; i++) { for (int j = 0; j<5; j++) { printf("%d", arr[i][j]); } printf("\n"); } } void m

我尝试了《理解和使用C指针》(Reese)一书中的以下代码示例,该示例演示了如何将二维数组指针传递给函数:

void display2DArray(int arr[][5], int rows) {
   for (int i = 0; i<rows; i++) {
      for (int j = 0; j<5; j++) {
         printf("%d", arr[i][j]);
      }
      printf("\n");
   }
}

void main() {
   int matrix[2][5] = {{1, 2, 3, 4, 5},{6, 7, 8, 9, 10}};
   display2DArray(matrix, 2);
这个负数是多少

我认为取消引用地址
0x7fffffe198
应该会产生
0x7fffffe1c0

这个负数7744是什么

它是FFFFFFFFFFFFFFE1C0的十进制转换

我认为解引用地址0x7FFFFFE198应该产生0x7fffffffe1c0

是的,但它被转换为十进制表示


内存地址不是负数,但用于表示内存位置的数据类型可以是负数。

您要求GDB打印某个内容,而不指定它是什么。当使用
arr
&arr
时,可以推断出基础类型(显然,只需查看您的输出)。当显示手动编码的文字地址和解引用时,它可能只知道一件事:假设一个整数并给出它所发现的结果。如果你告诉它以无符号十六进制打印它,你就会得到你所期望的结果。
-7744
#x1fffe1c0
,它是你所期望看到的结果的下半部分。内存地址从来都不是负数,只是以报告的方式。如果您使用的是一本编码为
void main()
的书,我建议您使用
int main(void)
int main(int argc,char*argv[])找到一本更新的书。
(gdb) p arr
$156 = (int (*)[5]) 0x7fffffffe1c0
(gdb) p &arr
$157 = (int (**)[5]) 0x7fffffffe198
(gdb) p *0x7fffffffe198
$158 = -7744