【问题标题】:Segmentation Fault error: while subtracting two arrays分段错误错误:同时减去两个数组
【发布时间】:2014-04-19 16:31:59
【问题描述】:

我不能减去使用 malloc 声明的两个数组。有什么问题?

#include<stdio.h>
#include<conio.h>
void main()
{
float *a,*b,*c;
int i;
a=(float*)malloc(8*sizeof(float));
b=(float*)malloc(8*sizeof(float));
c=(float*)malloc(8*sizeof(float));
a[1]=8.0;a[2]=9.0;a[3]=1.0;a[4]=2.0;a[5]=0.0;a[6]=8.0;a[7]=18.0;a[8]=2.0;
b[1]=10.0;b[2]=1.0;b[3]=13.0;b[4]=0.0;b[5]=100.0;b[6]=1.0;b[7]=20.0;b[8]=0.0;
for(i=1;i<=8;i++)
{
c[i]=a[i]-b[i];
printf("%d",c[i];// IAM GETTING ERROR HERE
}
getch();
}

【问题讨论】:

  • 我看到你使用 a[8]b[8]。您正在访问超出您从8*sizeof(float) 请求的区域。你的数组索引应该从 0 开始,例如 a[0] ,a[1] ...你可以上升到 a[7]。修复此问题并再次运行。还要确保 a、b、c 不为空。从 0 开始数组索引。如果您希望结果以十进制格式显示,请在 printf 中使用 %f 而不是 %d。您还错过了 printf 的 ) .此外,您应该通过执行free(a) 等释放请求的内存。

标签: arrays fault


【解决方案1】:

a = (float*)malloc(8*sizeof(float));

这将分配8个连续的块,每个块的大小等于float的大小,并返回指向第一个块的指针,每个块的值可以被访问为

a[0], a[1] ,..., a[7] 或者 *(a), *(a+1), ..., *(a+7)

在您的代码中,我可以看到 a[8]、b[8]、c[8],将您的代码修改为从 0 到 7 而不是从 1 到 8

【讨论】:

    【解决方案2】:

    Gautam 似乎已经在评论中回答了你的问题,我想让它更清楚。

    分段错误几乎总是由于内存使用不当造成的,而在您的情况下,罪魁祸首是 c[8]。 请记住,在像 C 这样的语言中,您从 0 开始计数,也就是说,如果数组的长度为 8,则其索引应该是 0、1、... 7。实际上,索引更像是偏移量;第一个元素不需要任何偏移量,因此索引为 0,第二个元素需要添加一个偏移量(数组元素的大小),第三个需要两个,第四个需要三个,等等。

    对于 malloc():分配的每一块内存最终都应该被释放以避免内存泄漏。在您的情况下,为什么不只声明三个长度为 8 的数组呢?这样你就不用担心这些了。

    格式字符串:“%d”用于打印小数,而“%f”用于浮点数。如果你想在屏幕上看到浮点数“%f”是你应该去的。 (您的 printf() 中也缺少右括号。我认为这只是一个错字)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多