我试图在调用 set 函数之前和之后打印一个 int a 来设置 a 的值。我在 C 中执行此操作。当我编译它时没有错误,但是当我尝试运行它时,我遇到了段错误。
这是我目前所拥有的:
#include <stdio.h>
int main(){
int* a;
printf("%d",*a);
set(10);
printf("%d", *a);
return 0;
}
int set(int*a, int val){
*a = val;
return *a;
}
最佳答案
int main(){
int* a;
printf("%d",*a);
你所拥有的是一个指向 int
而不是实际的 int
的指针。
虽然这是打印它指向的 int
的正确方法,但不幸的是它指向一个任意内存位置,这就是你崩溃的原因。
您不能解引用任意指针,它们必须指向有效的东西,例如如果您的代码以:
int main(){
int target_of_a = 42;
int *a = &target_of_a;
printf ("%d", *a);
此外,您可能应该调用 set
,例如:
set (a, 10);
虽然编译器通常会警告您,但在这种情况下,它可能只是说在您调用它时它不知道 set
。如果它知道,它可能会告诉您参数不匹配。
实现该目标的一种方法是确保在调用函数之前为其定义了一个原型(prototype):
int set(int*,int);
或者只是将函数移动到 main
之前。通过所有这些更改(以及一些一般性的整理),您最终会得到:
#include <stdio.h>
int set (int *a, int val) {
*a = val;
return *a;
}
int main (void) {
int target_of_a = 42;
int *a = &target_of_a;
printf ("%d\n", *a);
set (a, 10);
printf ("%d\n", *a);
return 0;
}
返回您正在更改的变量是否明智也值得商榷,但在某些情况下这可能会有用(例如,如果您想立即使用它而无需其他声明:例如 printf ("%d\n", set (a, 10));
)所以我将其保留原样。
我还应该提到,在这种情况下人为创建指针变量有点不寻常。
现在您的代码可能只是一些您已经有指针的更复杂场景的简化,但如果没有,通常的方法是只拥有 int
本身,只需使用 &
即时创建一个:
#include <stdio.h>
int set (int *a, int val) {
*a = val;
return *a;
}
int main (void) {
int a = 42;
printf ("%d\n", a);
set (&a, 10);
printf ("%d\n", a);
return 0;
}
关于c - 在 C 中打印一个 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28079060/