C 带指针的Void函数

C 带指针的Void函数,c,pointers,null-pointer,C,Pointers,Null Pointer,我正在尝试编写一个代码,用int指针检查数字是否为偶数。 我的代码是这样的: #include <stdio.h> #include <string.h> void isEven (int *isFlag, int num) { if (num % 2 == 0) { *isFlag = 1; } else { *isFlag = 0; } } int main() { int num = 4;

我正在尝试编写一个代码,用int指针检查数字是否为偶数。
我的代码是这样的:

#include <stdio.h>
#include <string.h>

void isEven (int *isFlag, int num) {
    if (num % 2 == 0) {
        *isFlag = 1;
    } else {
        *isFlag = 0;
    }
}

int main() {
    int num = 4;
    int *isFlag = 0;
    isEven(isFlag, num);
    printf("%d", isFlag);
}  
#包括
#包括
void isEven(int*isFlag,int num){
如果(数值%2==0){
*isFlag=1;
}否则{
*isFlag=0;
}
}
int main(){
int num=4;
int*isFlag=0;
isEven(isFlag,num);
printf(“%d”,isFlag);
}  

但是我遇到了分段错误,我希望看到
isFlag=1
,代码中有什么问题?(我知道我们可以做得更好,但我正在努力理解指针)

int*isFlag=0
isFlag
定义为指向
int
的指针,并将其初始化为指向“无处”。(当常量
0
用于指针时,它表示不指向任何对象或函数的空指针。)

您不需要在
main
例程中为此函数创建指针。您可以使用
intisflag=0定义普通
int
并使用
isEven(&isFlag,num)将
int
的地址传递给
isEven


&isFlag
将获取
isFlag
的地址并将其传递给
isEven
isEven
参数
int*isFlag
将具有该指针的值。尽管它与
main
中的
isFlag
具有相同的名称,但它是一个不同的对象,因为它定义在不同的范围内(在函数参数内,而不是在
main
内),并且具有不同的类型;它将是指向
int
的指针。因此,您将其用作
*isFlag
内部
isEven
来访问它所指向的
int

您将
isFlag
声明为
main
中的指针,并将其设置为空指针常量。然后将该空指针传递给
isEven
,该指针将尝试取消引用它。取消对空指针的引用会触发空指针,在这种情况下会导致崩溃

isFlag
定义为
int
并将其地址传递给
isEven

int main() {
    int num = 4;
    int isFlag;
    isEven(&isFlag, num);
    printf("%d", isFlag);
}  
代码中有什么问题

在询问我们之前,让您的编译器告诉您它认为您的代码可能存在哪些问题:

如果您这样做了,编译器会告诉您(以gcc为例):

:在函数“main”中:
:16:14:警告:格式“%d”需要类型为“int”的参数,但参数2具有
键入“int*”[-Wformat=]
16 | printf(“%d”,isFlag);
|             ~^   ~~~~~~
|              |   |
|整型*
|%ls

这并不是你得到分段错误的确切原因,但它确实告诉你你对待一个指向int的指针就像它是一个
int
。这对于
printf()
指令是正确的,但更一般地说是正确的。因此,初始化为
0
就是初始化
int
的方式。。。正如其他答案所解释的,这不是您想要做的。

您的代码的问题在于,您似乎输入了一个错误,因为您还没有关于指针的坚实知识

在本声明中

int *isFlag = 0;
您声明了空指针,因为它是由整数常量0初始化的。因此,使用空指针访问内存会导致未定义的行为

另一方面,在这份声明中

printf("%d", isFlag);
您正在将变量
isFlag
作为
int
类型的变量输出

您需要声明变量确实具有类型
int
,并通过指向它的指针通过引用将其传递给函数

这就是main中的代码

int main( void ) {
    int num = 4;
    int isFlag = 0;
    isEven( &isFlag, num );
    printf("%d", isFlag);
}  
此外,函数
isEven
的定义也可以更简单

void isEven( int *isFlag, int num ) {
    *isFlag = num % 2 == 0;
}

每个人都总结了几个问题

如果您仍然想坚持您的示例(您不应该,更愿意),您仍然可以通过以下方式实现它,将内存分配给ptr:

#包括
#包括
#包括
void isEven(int*isFlag,int num){
如果(数值%2==0){
*isFlag=1;
}否则{
*isFlag=0;
}
}
int main(){
int num=4;
int*isFlag;
isFlag=malloc(sizeof(int));
isEven(isFlag,num);
printf(“%d\n”,*isFlag);//还可以使用*isFlag打印ptr地址处的值
printf(“%p\n”,isFlag);//打印isFlag的地址
}  

int*isFlag=0
是您的问题。您应该为int分配内存并将其分配给isFlag。打开编译器警告并读取它们<代码>printf(“%d”,isFlag)->
printf(“%d”,*isFlag)。这就是问题之一。
printf(“%d”,isFlag)
打印指针的地址。您可以使用指针进行写入。告诉我当你通过它写作时指针指向的位置,我不必告诉你为什么会有segfault。我正要发布我的答案,然后我看到了4个答案,似乎每个人都在赶时髦^^注意,你将isFlag声明为ptr,我认为dbush的答案最准确地反映了你应该做的事情,还有其他很好的解释
void isEven( int *isFlag, int num ) {
    *isFlag = num % 2 == 0;
}