C语言 处理阵列时出现分段错误(核心转储)错误[重复]

ddrv8njm  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(150)

此问题在此处已有答案

How do I determine the size of my array in C?(24个答案)
12天前关闭。
我有一个函数ExtractNumber,我从main函数调用它,如下所示:

ExtractNumber(Array, &Numbers1, &Numbers2);

char**Array是动态分配数组,包含来自stdin字符串,这些字符串以double,double,然后是某个字符串开头doubleNumbers1和double Numbers2数组是动态分配数组,我希望将值从前面char数组中提取到这些数组中
ExtractNumbers函数如下所示:

//char **  array is my dynamically allocated array
//which reads string from stdin until EOF signal.
//double **Numbers1 and double **Numbers2 are my arrays for those 
//double values, which are allocated in main function

void  ExtractNumber (char **array, double **Numbers1, double **Numbers2)
{

double a,b;

char*  str;

//ArrMax is variable where number of lines stored in
for (int i = 0; i < *ArrMax; i++)
{

str = array[i];
printf ("\n%s\n", str);
sscanf(str, "%lf,%lf",&a, &b);
*Numbers1[i] = a;
*Numbers2[i] = b;
printf ("%lf %lf",(*Numbers1)[i] , (*Numbers2)[i]);
}

}
//main function looks like this
//LenMax calculates the number of lines in Array
int main ()
{

  char** Array;
  int LenMax;
  double * Numbers1;
  double * Numbers2;

  printf ("Insert string:\n");
  Array = ReadArray(&LenMax);
  
Numbers1 = (double*) malloc (sizeof (Numbers1) * LenMax);
Numbers2 = (double*) malloc (sizeof (Numbers2) * LenMax);

  ExtractNumber(Array, &Numbers1, &Numbers2);

for (int i = 0; i < LenMax; i++)
printf ("%lf\n", Numbers1[i]);

  for (int i = 0; i<LenMax;i++)
  {
      free (Array[i]);
  }
  
  return 0;

}

我把这些printfs放在那里只是为了测试函数内部是否有str或 *Numbers1的问题,没有,所有的东西都按我想的那样打印出来了,但是我仍然得到了核心转储错误,当我试图从函数外部打印值时,它说(null).有什么建议吗?
我有它的工作之前,但在那之后,我做了一些改变,它停止工作。我很肯定,现在它几乎相同,它是如何之前,但仍然找不到什么错误。我有类似的功能,在其他程序,它的工作刚刚好,我超级困惑rn。我尝试在函数中创建两个临时数组,将值保存到其中,然后将它们传输到Numbers1和Numbers2值,但也没有成功工作。
编辑:我将代码更改为

void  ExtractNumber (char ** array, double ** Num1, double ** Num2, int ArrMax)
{

double a,b;

char*  str;

//ArrMax is variable in which the number of lines in my array is stored
for (int i = 0; i < ArrMax; i++)
{
str = array[i];
sscanf(str, "%lf,%lf",&a, &b);
*Num1[i] = a;
*Num2[i] = b;
}

}

不再发生内核转储错误。但是,如果标准输入中有2行,则函数只能读取第一行的值,第二行的值为零。

ntjbwcob

ntjbwcob1#

所以我在功能上做了一些改动,现在一切都很好。

void  ExtractNumber (char ** array, double ** Numbers1, double ** Numbers2, int  ArrMax)
{

double a,b;
int size = ArrMax;
char*  str;

double * tmp1;
double * tmp2;

tmp1 = (double*) malloc (sizeof (tmp1) * size);
tmp2 = (double*) malloc (sizeof (tmp2) * size);

for (int i = 0; i < size; i++)
{
str = array[i];
sscanf(str, "%lf,%lf",&a, &b);
tmp1[i] = a;
tmp2[i] = b;
}
free(*Numbers1);
free(*Numbers2);

*Numbers1 = tmp1;
*Numbers2 = tmp2;
}

我做了一个变量,用来保存charr数组中的行数,我后来在for循环中使用了它。我还做了两个临时数组,然后把它们复制到我原来的数组中。

相关问题