c - 在 C 中打印一个 int

标签 c pointers segmentation-fault int

我试图在调用 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/

相关文章:

整数赋值的 C 段错误

c - 帮助解释 gdb : segfault in function

C将指针传递给函数,如何?

c - 基本问题 : C function to return pointer to malloc'ed struct

c - 我不明白为什么我们将 "&"放在 ageAmis 的 scanf 中,而 ageAmis 是一个指针?

c - 将特定结构传递给 C 中的函数

c++ - 处理删除命令期间出现段错误

c - 添加 for 循环时出现段错误

c - 我可以使用 gdb 的 x 命令打印内存,但是如果我使用 printf,则会出现段错误

c++ - 在 arm-linux-androideabi-gcc 上使用 c/c++ 宏对 char '#' 进行字符串化