这两个代码片段有什么区别?

时间:2014-04-01 13:30:14

标签: c arrays malloc

两者都显示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;
}

3 个答案:

答案 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()成功,则需要检查。