3
回答
数值与指针比较,这算BUG吗?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
<无标签>
举报
痞子蔡
发帖于4年前 3回/165阅
共有3个答案 最后回答: 4年前

不是Bug。注意int **N 是一个指向指针的指针,而不是二维数组的指针。int **N = (int **)T这里是强制将二维数组指针转为指向指针的指针。由C语言中的一条定律:如果p是个指针变量,则p[i] 永远等价于 *(p+i),所以我们很容易得出:
N[0] = 1;
N[1] = 2;
N[2] = 3;
N[3] = 4;
而 N[0][0] = *p[0] = *(1),引用地址为1的内存,肯定是报错的。
N[0][1] = *p[1] = *(2),也是错的 以上结论可以用以下代码代码验证:

#include <stdio.h>
int main()
{
	int i, T[2][2] = {{1,2},{3,4}};
	int *M = (int *) T, **N=(int **)T;
	for(i=0;i<4;i++)
	{
		printf("%d,%d\n",M[i],N[i]);
		//printf("%d",*N[i]); 执行该语句程序将出错 
	}
	return 0;
}

由此可知, 二维数组指针与指向指针的指针是不等价的
而以下写法才是正确的:
int *N = &T[0][0];

在C语言中,多维数组在存储的时候实际上还是一维数组。

M[i]==N[i]  这里是不是要报警告?

这不是bug  不过这么比较的话两边类型应该不一致会出警告

M[0]=1,

N[0]确实等于1   但是N[0]相当于 (int *)1

1==(int *)1 确实没错

引用来自“eel”的评论

M[i]==N[i]  这里是不是要报警告?

这不是bug  不过这么比较的话两边类型应该不一致会出警告

M[0]=1,

N[0]确实等于1   但是N[0]相当于 (int *)1

1==(int *)1 确实没错

是的,ISO标准中是不允许这么比较的,但是C语言中只是给出警告,可能是历史问题,如果是C++的话是编译不通过,提示ISO C++ forbids comparison between pointer and integer
顶部