c中的分段错误(核心转储)

Posted

技术标签:

【中文标题】c中的分段错误(核心转储)【英文标题】:Segmentation fault (core dumped) in c 【发布时间】:2014-04-18 17:49:13 【问题描述】:

我一直在编写一个 c 代码,它接收一个整数数组并将数组中的每个值加 1,但是我遇到了分段错误。我是 C 新手,不知道是什么导致了这个错误 这是代码:

#include <stdio.h>
void add1(int a[])
    int i;
    for(i=0;i<sizeof(a);i++)
a[i]=a[i]+1;
    



void main()
    int arr[10]=1,2,3,4,5,76,7,5,3;
    add1(arr);
int i;
for(i=0;i<sizeof(arr);i++)
arr[i]=arr[i]+1;
printf("%d ",arr[i]);




【问题讨论】:

sizeof(arr) == 10 * sizeof(int)sizeof(a) == sizeof(int*) 【参考方案1】:

我可以确定您程序中的三个问题,并按严重程度列出它们

    (代码错误)数组大小与数组对象的大小不同

    for(i=0;i<sizeof(arr);i++)
    

    您认为 sizeof 会返回数组大小(元素数量)的假设是错误的。 sizeof 用于计算数据类型的大小,在本例中是大小为 10 的整数数组。

    你应该这样做

    for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
    

    这意味着,数组对象的大小是单个数组元素大小的倒数。

    (功能错误)当您将数组传递给函数时,它会退化为指针。

    void add1(int a[])
        int i;
        for(i=0;i<sizeof(a);i++)
    

    因此,sizeof 将改为返回整数指针的大小而不是数组的大小。您应该将数组大小作为附加参数传递

    void add1(int a[], size_t sz)
        int i;
        for(i=0;i < sz;i++)
    

    (样式)数组的初始化不需要明确的数组大小

    int arr[10]=1,2,3,4,5,76,7,5,3;
    

    应该是

    int arr[]=1,2,3,4,5,76,7,5,3;
    

【讨论】:

或者它可能是76, 的拼写错误7, 6,。或者,也许他想要一个包含 arr[9] == 0 的 10 元素数组。 @JonathanLeffler:可能是,但我无法猜测,如果它是错字。关于第二种情况,可能是,但仍然是单例元素,我更愿意枚举它。

以上是关于c中的分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中的向量中键入所有值后出现分段错误(核心转储)

C中的分段错误问题(核心转储)

获取“分段错误核心转储”

pyqt5 中的分段错误(核心转储)

在opencv c ++中查找图像卷积时出现分段错误(核心转储)错误

识别导致分段错误(核心转储)的错误