Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C编程中,可以将指针传递到scanf参数中吗?_C_Printf_Scanf - Fatal编程技术网

在C编程中,可以将指针传递到scanf参数中吗?

在C编程中,可以将指针传递到scanf参数中吗?,c,printf,scanf,C,Printf,Scanf,我目前正在编写一个C程序,试图将指针作为参数传递给scanf 例如: int main() { int *num; scanf("%d", num); printf("%d", *num); } 考虑到典型的scanf传入一个地址来存储一个值,我不明白为什么它不能存储指针持有的地址。当我试图运行这段代码时,我收到一个内存错误。可能是什么问题?只有当num指向有效内存时,才能执行此操作 // Not OK // Leads to undefined behavior s

我目前正在编写一个C程序,试图将指针作为参数传递给scanf

例如:

int main() { 
    int *num;
    scanf("%d", num);
    printf("%d", *num);
}
考虑到典型的scanf传入一个地址来存储一个值,我不明白为什么它不能存储指针持有的地址。当我试图运行这段代码时,我收到一个内存错误。可能是什么问题?

只有当num指向有效内存时,才能执行此操作

// Not OK
// Leads to undefined behavior since num does not point
// to anything valid.
int* num;
scanf("%d",num);
只有当num指向有效内存时,才能执行此操作

// Not OK
// Leads to undefined behavior since num does not point
// to anything valid.
int* num;
scanf("%d",num);

我推荐曼斯坎夫。你会发现答案很简单。请澄清num的地址!传递指针是可以的,只是忘记了初始化它。num未定义,因此您正在向scanf传递一个随机的未知指针值。只需将num初始化为要用于该值的int变量的地址,它就可以工作了。只需声明类似int-val的内容;然后分配num=&val;初始化num.您刚刚发现了指针为什么很难:与其说指针很难,还不如说内存分配很难跟踪。无论何时使用指针,都必须考虑指针指向何处,是否有足够的有效内存分配给我执行的操作?在C语言中没有任何机制可以神奇地为指向的指针分配内存;你几乎总是得自己照顾它。我推荐曼斯坎夫。你会发现答案很简单。请澄清num的地址!传递指针是可以的,只是忘记了初始化它。num未定义,因此您正在向scanf传递一个随机的未知指针值。只需将num初始化为要用于该值的int变量的地址,它就可以工作了。只需声明类似int-val的内容;然后分配num=&val;初始化num.您刚刚发现了指针为什么很难:与其说指针很难,还不如说内存分配很难跟踪。无论何时使用指针,都必须考虑指针指向何处,是否有足够的有效内存分配给我执行的操作?在C语言中没有任何机制可以神奇地为指向的指针分配内存;你几乎总是要自己处理它。我认为将声明者分组语言意图的方式是更好的方式,即INT*I,而不是误导的INT*I。int*在语法上不是一个类型。相反,它是一种类型和声明器的一部分,声明器将更紧密地绑定到后面的任何内容,而不应用于后面的任何其他变量?毕竟,它仍然是一个地址。它可以指向垃圾内存。但它通常指向尚未分配给进程的内存,这就是为什么在运行它时会出现错误。@b如果没有为num分配对象的地址,则计算表达式*num会产生未定义的行为。幸运的是,您可以让UB清单看起来好像num确实指向了一个对象,但它可以做所有其他的事情。其中最有可能的是程序崩溃,更糟糕的是,悄悄地破坏程序的数据。我认为将声明者分组为语言意图的更好方式,即INT*I,而不是误导性INT*I。int*在语法上不是一个类型。相反,它是一种类型和声明器的一部分,声明器将更紧密地绑定到后面的任何内容,而不应用于后面的任何其他变量?毕竟,它仍然是一个地址。它可以指向垃圾内存。但它通常指向尚未分配给进程的内存,这就是为什么在运行它时会出现错误。@b如果没有为num分配对象的地址,则计算表达式*num会产生未定义的行为。幸运的是,您可以让UB清单看起来好像num确实指向了一个对象,但它可以做所有其他的事情。其中最有可能的是程序崩溃,更糟糕的是,悄悄地破坏程序的数据。而这些表现并不一定是一致的。
// Also OK
int i;
int* num = &i;
scanf("%d",num);