C 添加工作正常的代码时出现分段错误

C 添加工作正常的代码时出现分段错误,c,pointers,reference,segmentation-fault,C,Pointers,Reference,Segmentation Fault,我是C语言的新手,我有一些基本的函数,比如swap和read_int。read_int应该接收一个字符,它实际上是一个介于0和9之间的数字,并返回它的数值 这些功能似乎有效 代码如下: #include <stdio.h> #include <ctype.h> #include <string.h> void swap(int *adra, int *adrb){ int tmp = *adra; *adra = *adrb; *ad

我是C语言的新手,我有一些基本的函数,比如swap和read_int。read_int应该接收一个字符,它实际上是一个介于0和9之间的数字,并返回它的数值

这些功能似乎有效

代码如下:

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

void swap(int *adra, int *adrb){
    int tmp = *adra;
    *adra = *adrb;
    *adrb = tmp;
}

int read_int(int *adr){
    printf("Entrer une suite d'entier entre 0 et 9.\n");
    char c = getchar();
    while (c != '\n'){
        if ( c >= 48 && c <= 57){
            *adr = *adr + c - 49;
            c = getchar();
        }
        else {
            return 0;
        }
    }
    return 1;
}


int main(){
    int a = 2;
    int b = 3;
    swap(&a,&b);
    printf("%d\n",a);
    printf("%d\n",b);

    char c = getchar();
    while (c != '\n'){
        printf("Le caractere ’%c’ est en fait le nombre %d\n",c,c);
        c = getchar();
    }

    int *test;
    printf("read_int = %d\n",read_int(test));
    printf("test = %d\n",*test);

    /*int tab[] = {1,2,3,4};
    int *pi = tab;
    short *ps = (short *) tab;
    char *pc = (char *) tab;
    printf("int : %p %p\n",pi,pi+1);
    printf("short : %p %p\n",ps,ps+1);
    printf("char : %p %p\n",pc,pc+1);
    printf("%ld\n",(long)(&pi[1]-&pi[0]));
    printf("%ld\n",(long)(&ps[1]-&ps[0]));
    printf("%ld\n",(long)(&pc[1]-&pc[0]));*/

    return 1;
}
对我来说,这是预期的结果

但是当我取消注释main中的最后一段代码时,我得到的输出是:

3
2
1
Le caractere ’1’ est en fait le nombre 49
Entrer une suite d'entier entre 0 et 9.
1
[1]    3960 segmentation fault  
我不明白为什么最后一个与我上面写的内容无关的块会引发分割错误。特别是当我在另一个文件中尝试它时,它工作得非常好

有线索吗


谢谢。

您正在向read_int()传递一个未初始化的指针

    int *test;  // test should contain the address of an integer
    printf("read_int = %d\n",read_int(test));
    printf("test = %d\n",*test);
若你们试图在一个无效的地址上写,你们会得到分段错误

试试看

    int test;
    printf("read_int = %d\n",read_int(&test));
    printf("test = %d\n",test);
通过这种方式,您将
test
loacl变量的地址传递给函数,该变量肯定有效,并按值打印它

为了使用指针,您应该动态分配它:

    int *test = malloc( sizeof(int));
    printf("read_int = %d\n",read_int(test));
    printf("test = %d\n",*test);
    free(test);

您正在向read_int()传递未初始化的指针

    int *test;  // test should contain the address of an integer
    printf("read_int = %d\n",read_int(test));
    printf("test = %d\n",*test);
若你们试图在一个无效的地址上写,你们会得到分段错误

试试看

    int test;
    printf("read_int = %d\n",read_int(&test));
    printf("test = %d\n",test);
通过这种方式,您将
test
loacl变量的地址传递给函数,该变量肯定有效,并按值打印它

为了使用指针,您应该动态分配它:

    int *test = malloc( sizeof(int));
    printf("read_int = %d\n",read_int(test));
    printf("test = %d\n",*test);
    free(test);

int*测试read\u int()
之前,未初始化code>。这意味着当您尝试使用
*adr=*adr+c-49访问位置时您遇到了大麻烦(=未定义的行为)!
addr
的值是多少?
*addr
的初始值是多少

您必须初始化它以指向有效变量。您只需声明一个
int
,并将其地址传递给函数:

int value = 0;
read_int(&value);
对于显式指针,这相当于:

int value = 0;
int* addr = &value;
read_int(addr);

int*测试read\u int()
之前,未初始化code>。这意味着当您尝试使用
*adr=*adr+c-49访问位置时您遇到了大麻烦(=未定义的行为)!
addr
的值是多少?
*addr
的初始值是多少

您必须初始化它以指向有效变量。您只需声明一个
int
,并将其地址传递给函数:

int value = 0;
read_int(&value);
对于显式指针,这相当于:

int value = 0;
int* addr = &value;
read_int(addr);

您可以尝试
int测试
读取int(&test)
您可以尝试
int-test
读取(测试)
太棒了!顺便说一句:因为一个程序似乎可以工作,但这并不意味着它是无错误的。特别是在C语言中,这里的代码就是一个证明。别忘了激活编译器的警告(例如:-带有gcc和clang的Wall-Wextra选项)。太棒了!顺便说一句:因为一个程序似乎可以工作,但这并不意味着它是无错误的。特别是在C语言中,这里的代码就是一个证明。别忘了激活编译器中的警告(例如:带有gcc和clang的-Wall-Wextra选项)。