[英]Address behaviour with dynamic memory allocation in C
我编写了以下两个代码,并分别给出了它们的输出。
代码1:
#include<stdio.h>
int* allocate(int array, int value)
{
int k[array];
//int *k=(int *)malloc(array*sizeof(int));
for(int i=0;i<array;i++)
{
k[i]=value;
printf("%d ",k[i]);
}
printf("\n");
return k;
}
int main(void)
{
int *p=allocate(3,25);
for(int i=0;i<3;i++)
printf("%d ",p);
return 0;
}
输出:
25 25 25
0 0 0
代码2:
#include<stdio.h>
int* allocate(int array, int value)
{
//int k[array];
int *k=(int *)malloc(array*sizeof(int));
for(int i=0;i<array;i++)
{
k[i]=value;
printf("%d ",k[i]);
}
printf("\n");
return k;
}
int main(void)
{
int *p=allocate(3,25);
for(int i=0;i<3;i++)
printf("%d ",p);
return 0;
}
输出:
25 25 25
12329552 12329552 12329552
我知道在第一个代码中,数据是在堆栈中分配的,一旦执行return语句,编译器将清除它们。 但是我只是打印'p'而不是'* p'。 为什么显示0? 毕竟,指针* p在main()中声明。
请简单地解释一下。 提前致谢。
编辑1:我正在添加一个新代码,以使我的问题清楚。 代码3:
#include<stdio.h>
int* allocateArray(int size, int value)
{
int arr[size];
for(int i=0; i<size; i++) {
arr[i] = value;
}
return arr;
}
int main(void)
{
int* vector = allocateArray(5,45);
for(int i=0; i<5; i++) {
printf("%d\t", &vector[i]);
}
return 0;
}
输出:
0 4 8 12 16
在第三段代码中,我无法打印vector [i]或*(vector + i)。 编译器终止程序。
我只需要解释0和第三代码输出中的模式。
在您的答案中,您解释说,您了解到,您正在返回一个指向allocate
数组的指针,该数组在allocate
指针分配给main
p
之前就不存在了,并且想知道为什么会出现空指针而不是“现实”指针例如,堆栈指针。
NULL
? 如注释中所述,编译器还知道在检查该指针时该指针将无效,因此由于以下规则,它可以返回空指针:
根据ISO / IEC 9899:2011第6.2.4节 :
当指针所指向的对象(或刚过去的对象)达到其生命周期的终点时,指针的值将变得不确定 。
通过不确定,这意味着该指针的值将是未指定的或潜在的陷阱表示形式 (如果通过任何操作读取,则将导致未定义的行为),这意味着可以返回空指针以及指向另一个现有指针的指针。对象,没有对象的指针以及可能导致程序崩溃或意外行为的指针值。
NULL
? 至于为什么编译器实现决定使用null指针,可能是因为它是一个不可能悄无声息地中断程序的选择。 编译器通常不会影响性能,从而使您免于自己的烦恼,但是在这里,完全可以自由地优化前面的大部分功能,只需返回一个空指针,该指针在典型的托管环境中(如果被取消引用)将立即导致段错误,而不是通过尝试使用“已分配”数组来允许覆盖内存中的其他对象的可能性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.