Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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程序中的分段错误?_C - Fatal编程技术网

是什么导致了这个小小的c程序中的分段错误?

是什么导致了这个小小的c程序中的分段错误?,c,C,我正在编写一个小c程序来练习malloc和sscanf库函数。但不幸的是,我得到了一个分段错误。我在谷歌上搜索了好几个小时,但没有结果。有人能带我离开这吗 #include <stdio.h> #include <stdlib.h> void print_array(int a[], int num_elements); int main(void) { int m; printf("How many numbers do you count:

我正在编写一个小c程序来练习
malloc
sscanf
库函数。但不幸的是,我得到了一个分段错误。我在谷歌上搜索了好几个小时,但没有结果。有人能带我离开这吗

#include <stdio.h>
#include <stdlib.h>

void print_array(int a[], int num_elements);

int main(void) {
    int m;    
    printf("How many numbers do you count: \n");  
    scanf("%d", &m);
    int *a = (int*)malloc(m * sizeof(int*));
    char buf[100];
    setbuf(stdin, NULL);
    if (fgets(buf, sizeof buf, stdin) != NULL) {
        char *p = buf;
        int n, index;
        while (sscanf(p, "%d %n", &a[index], &n) == 1 && index < m) {
            // do something with array[i]
            index++;  // Increment after success @BLUEPIXY
            p += n;
        }
        if (*p != '\0')
            printf("you are giving non-numbers, will be ignored");
    }

    print_array(a, m);
    free(a);
    return 0;
}

void print_array(int a[], int num_elements) {
    int i;
    for (i = 0; i < num_elements; i++) {
        printf("%d ", a[i]);
    }
}
#包括
#包括
无效打印数组(int a[],int num_元素);
内部主(空){
int m;
printf(“你数了多少个数字:\n”);
scanf(“%d”、&m);
int*a=(int*)malloc(m*sizeof(int*);
char-buf[100];
setbuf(标准输入,空);
如果(fgets(buf,sizeof buf,stdin)!=NULL){
char*p=buf;
int n,索引;
而(sscanf(p,%d%n,&a[指数],&n)=1&指数
大多数[潜在]错误原因似乎来自未初始化自动变量:

scanf("%d",&m);
如果失败,则
m
有一个未定义的值,因为您没有初始化它

sscanf
中,您使用
&a[index]
,但
index
尚未初始化,因此可以在任何地方写入


另请参见注释,该注释识别了更多EROR(例如,检查
sscanf
)的返回值。

您的
malloc
存在故障。替换
int*a=(int*)malloc(m*sizeof(int*)带有
int*a=(int*)malloc(m*sizeof(int))。
幸运的是,
sizeof
int
int*
小,否则你会遇到一大堆问题

我无法重现错误,最好下次输入文本,但要调试segfault,我依赖于gdb

$gcc-g程序c-o程序

$gdb prog

gdb>运行[args]


这将在导致segfault的第行中断程序。使用本教程了解更多知识

您的程序有多个错误:

  • 您不检查
    scanf()
    的返回值。无效输入将导致
    m
    保持未初始化状态,分配
    m*sizeof(int)
    可能会失败

  • malloc
    计算的大小不正确。在C中,强制转换malloc()的返回值是不必要的,被认为是错误的样式。此外,您应该检查分配失败。改用这个:

    int *a = malloc(m * sizeof(int));
    
  • sscanf(p,%d%n,&a[index],&n)
    中的
    index
    未初始化。
当您告诉
sscanf()
int
值存储到内存中的某个随机地址时,肯定会导致未定义的行为

  • 在存储到
    &a[index]
    后测试
    索引
    ,可能会导致缓冲区溢出。在
    sscanf()前面交换测试

  • 以下是修改后的版本:

    #include <stdio.h>
    #include <stdlib.h>
    
    void print_array(const int a[], int num_elements);
    
    int main(void) {
        int m;    
        printf("How many numbers do you count:\n");  
        if (scanf("%d", &m) != 1 || m <= 0) {
            fprintf(stderr, "invalid input\n");
            return 1;
        }
        int *a = malloc(m * sizeof(int));
        if (a == NULL) {
            fprintf(stderr, "memory allocation failed\n");
            return 1;
        }
        char buf[100];
        setbuf(stdin, NULL);  // why do you want stdin to be unbuffered?
        if (fgets(buf, sizeof buf, stdin) != NULL) {
            char *p = buf;
            int n, index = 0;
            while (index < m && sscanf(p, "%d %n", &a[index], &n) == 1) {
                // do something with array[i]
                index++;  // Increment after success @BLUEPIXY
                p += n;
            }
            if (*p != '\0') {
                printf("you are giving non-numbers or extra input, will be ignored\n");
            }
        }
    
        print_array(a, m);
        free(a);
        return 0;
    }
    
    void print_array(const int a[], int num_elements) {
        for (int i = 0; i < num_elements; i++) {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    
    #包括
    #包括
    无效打印数组(常量int a[],int num_元素);
    内部主(空){
    int m;
    printf(“你数了多少个数字:\n”);
    
    如果(scanf(“%d”,&m)!=1 | m
    int*a=(int*)malloc(m*sizeof(int*);
    您正在为
    m
    指针的大小分配一个数组,而不是
    m
    int
    s.
    int-n,index;
    int-n,index=0;
    ANF(p),%d%n&&ssca[index],&n==1&code>,%d%n,&a[index],&n)==1
    开始使用gdb。结束horros
    int n,index;而(sscanf(p,%d%n,&a[index],&n)==1&&index
    您在&a[index]中存储了一些内容,而索引未初始化。