C语言 什么是“分段故障”

svujldwt  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(70)
#include<stdio.h>
int main()
{
    int N,A[N],i;
    printf("Dizinin eleman sayisi : ");
    scanf("%d", &N);
    //int A[N];
    for ( i = 0; i < N; i++)
    {
        printf("Dizinin elemani : ");
        scanf("%d", &A[i]);

    }
    for ( i = 0; i < N; i++)
    {
        printf(" %d ",A[i]);
    }
    
    for ( i = 0; i < N; i++)
    {
        printf("\ndizinin %d. elemani : %d\n", i,A[i]);
    }
    return 0;
    
}

字符串
我得到这个错误时,我想保存数组A的开始作为N维。这不是一个大问题,但我很好奇,因为我是新的编程,提前感谢你。

e0bqpujr

e0bqpujr1#

在定义int A[N]时,变量N未初始化。这是未定义的行为。由于A的访问越界,程序可能会发生segfault,这也是未定义的行为。大小小于零的数组是未定义的行为,但某些编译器支持将大小为零的数组作为扩展。以后更新数组int A[N]时,不会调整数组的大小N的值。“
请务必检查scanf()的传回值,否则您可能会在未初始化的变数上执行作业。
首选最小化变量范围(i)。

#include <stdio.h>

int main(void) {
    printf("Dizinin eleman sayisi : ");
    int N;
    if(scanf("%d", &N) != 1 || N <= 0) {
            fprintf(stderr, "scanf failed or N <= 0\n");
            return 1;
    }
    int A[N];
    for (int i = 0; i < N; i++) {
        printf("Dizinin elemani : ");
        if(scanf("%d", &A[i]) != 1) {
            fprintf(stderr, "scanf failed\n");
            return 1;
        }
    }
    for (int i = 0; i < N; i++)
        printf(" %d ", A[i]);

    for (int i = 0; i < N; i++)
        printf("\ndizinin %d. elemani : %d\n", i,A[i]);
}

字符串
和示例输出:

Dizinin eleman sayisi : 7
Dizinin elemani : 1
Dizinin elemani : 2
Dizinin elemani : 3
Dizinin elemani : 4
Dizinin elemani : 5
Dizinin elemani : 6
Dizinin elemani : 7
 1  2  3  4  5  6  7 
dizinin 0. elemani : 1

dizinin 1. elemani : 2

dizinin 2. elemani : 3

dizinin 3. elemani : 4

dizinin 4. elemani : 5

dizinin 5. elemani : 6

dizinin 6. elemani : 7

mrphzbgm

mrphzbgm2#

除了@Allan Wind的回答,
在C语言中,数组声明需要一个“预定义”的值。这是因为它们不是在执行代码的那一行时创建的,而是在函数的作用域创建时声明的。
这意味着当你编码时

int main() {
    int   size, arr[size];
    // some code
}

字符串
变量'size'和'x 0'将在程序启动时声明。'size'将包含garbage value,'x 0'的大小将在每次执行中变化。
不要这样做。
虽然这样的东西是可以接受的,但我仍然不建议使用可变大小的数组声明:

(any_type) function(unsigned (any_type) size)
{
   (any_type) arr[size];
   // some slightly better code
}


请注意,'unsigned'关键字防止了segfault -因为我们不能有一个负的大小-它没有修复坏的做法/实现。

相关问题