只是玩指针,试图将指针的地址传递给函数
使用:
void changer(int **ptr)
{
if(**ptr==NULL)
{
*ptr=(int *)malloc(sizeof(int));
**ptr=2;
}
}
int main()
{
int *ptr;
clrscr();
changer(&ptr);
printf("%d",*ptr);
getch();
return 0;
}
程序严格遵守,结果不符合预期!!
答案 0 :(得分:4)
您在ptr
检查中有NULL
的额外解除引用,并且您没有初始化指针。修复后程序应如下所示:
#include <stdio.h>
#include <stdlib.h>
void changer(int **ptr)
{
if(*ptr==NULL) // Dereference once, not twice
{
*ptr=(int *)malloc(sizeof(int));
**ptr=2;
}
}
int main()
{
int *ptr = 0; // Initialize the pointer
clrscr();
changer(&ptr);
printf("%d",*ptr);
getch();
return 0;
}
答案 1 :(得分:3)
崩溃是因为你的意思是第3行:
if (*ptr == NULL)
而不是
if (**ptr == NULL)
您还需要在第13行初始化指向NULL
的指针,因为您正在使用以上内容对其进行检查:
int *ptr = NULL;
在C中,变量不会自动初始化为零,除非在静态范围内分配,这取决于上下文而产生其他后果。
答案 2 :(得分:2)
您尚未在ptr
中初始化main()
,但在changer()
中检查它指向的内容是否为零。
使用:
#include <stdio.h>
#include <stdlib.h>
void changer(int **ptr)
{
if (*ptr == NULL)
{
*ptr = (int *)malloc(sizeof(int));
if (*ptr != NULL)
**ptr = 2;
}
}
int main(void)
{
int *ptr = NULL;
changer(&ptr);
printf("%d\n", *ptr);
return 0;
}
答案 3 :(得分:0)
像另一个人说的那样,你有额外的*。
我认为你可以使用这样一个事实,即c中的var声明是由一个类型和一个表达式构成的。
例如,声明int **ptr
(如果您的函数),假设表达式**ptr
来自int
类型,那么在检查**ptr == NULL
中,您进行比较int到指针。这是合法的,但当你发现自己正在做这样的事情时,你可能想重新考虑你做了什么。 (一个好的编译器可能会给你一个警告)