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中的分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章