C 带指针的Void函数
我正在尝试编写一个代码,用int指针检查数字是否为偶数。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;
我的代码是这样的:
#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;
}