两者都显示23
。但这两者有什么区别?
码-1
main()
{
int *ar[10];
**(ar+0) = 23;
printf( "%d", **(ar+0) );
return 0;
}
代码-2
main()
{
int *ar[10];
*(ar+0) = (int*) malloc(sizeof(int));
**(ar+0) = 23;
printf( "%d", **(ar+0) );
return 0;
}
答案 0 :(得分:3)
int *ar[10];
**(ar+0) = 23;
这是未定义的行为(您将23
分配给某个“随机”内存),因为您没有为此23
int元素分配空间({{1是指针数组。)
<击> int * ar [10]; (ar + 0)=(int )malloc(sizeof(int)); printf(“%d”,**(ar + 0));
在第一个ar
元素为int
分配内存,但应打印“垃圾”,因此ar
未初始化。 击>
在编辑问题并添加初始化时:第二个版本非常好(如果int
成功)。
malloc
与*(ar+0)
答案 1 :(得分:1)
第一个是未定义的行为。它将a
定义为一个包含10个整数指针的数组,但在写入中使用第一个指针(a[0]
)之前不会初始化指针。这是未定义的行为。
第二个首先将指针设置为malloc()
的返回值(带有really bad cast),因此它更有可能不调用UB。当然,如果分配失败并返回NULL
,那么它将再次出现未定义的行为。
答案 2 :(得分:0)
两个样本首先指定一个包含十个整数指针的数组。
然后第一个样本继续写入第一个指针的值 - 甚至没有分配它。这是未定义的行为,很可能是段错误。
第二个示例为第一个指针分配内存,然后在那里写入一个值。它具有完美定义的行为。也就是说,如果malloc()
成功,则需要检查。