zsh:所有程序运行后的中止消息?

时间:2014-02-17 21:59:31

标签: c memory-management

所以我正在运行此代码

#include <stdio.h>
#define ARRAYSIZE 17
#define NUMTHREADS 4

struct ThreadData {
  int start, stop;
  int *array;
};

void squarer(struct ThreadData *data) {
  int start = data->start;
  int stop = data->stop;
  int *array = data->array;
  int i;
  for (i=start; i<stop;i++) {
    array[i] = i*i;
  }
}

int main(void) {
  int array[ARRAYSIZE];
  int i, start, stop;
  struct ThreadData *data;
  data->array = array;
  int tasksPerThread = (ARRAYSIZE+NUMTHREADS-1)/NUMTHREADS;


  for (i=0; i < NUMTHREADS; i++) {
    start = i * tasksPerThread;
    stop = (i+1) * tasksPerThread;
    data->start = start;
    data->stop = stop;

    if (stop > ARRAYSIZE) {
      stop = ARRAYSIZE;
    }
    squarer(data);
  }
  for (i=0; i < ARRAYSIZE; i++) {
    printf("%d\n", i);
  }
  return 0;
}

由于某种原因,当我运行它时,如果给我错误消息zsh:abort ./thread。有趣的是,在阵列完全打印之后它才会中止?我不明白为什么会这样,当它执行完所有后它肯定无法访问超出范围内存?请注意,最初printf循环打印出数组项,但我将其更改为错误检查,它仍然给我相同的运行时错误。

3 个答案:

答案 0 :(得分:1)

在函数main中,变量data未初始化。无论何时使用此变量,您最有可能执行内存访问冲突,因此发生的所有事情都是“运气问题”。

您必须先将修复为

struct ThreadData* data = (struct ThreadData*)malloc(sizeof(struct ThreadData));
...
free(data); // at the end of the program

另一个选项(在这种情况下更好的选项)是使用静态分配的实例:

struct ThreadData data;
...
squarer(&data);

现在,您的数组的问题是索引。

变化:

array[i] = i*i

要:

array[i-start] = i*i

BTW,我强烈建议您在int array[ARRAYSIZE]结构中声明ThreadData ,或者在使用此结构的每个函数中动态分配它(而不是设置{{ 1}}指向函数array中的本地数组。只要您在多个地方开始使用此结构, 就会成为问题。

答案 1 :(得分:0)

你在main的第3行不合适,即未定义:

struct ThreadData *data;
data->array = array;

因为数据没有在第二行初始化,对吗? data指向任何地方 ...

struct ThreadData *data = (struct ThreadData*) malloc(sizeof(struct ThreadData));

可能有帮助。

答案 2 :(得分:0)

所以我的问题基本上是下面定义了stop变量的边缘情况条件,其中边缘情况被传递到结构中,因此stop值可能比数组大。

#include <stdio.h>
#define ARRAYSIZE 17
#define NUMTHREADS 4

struct ThreadData {
  int start, stop;
  int *array;
};

void squarer(struct ThreadData *data) {
  int start = data->start;
  int stop = data->stop;
  int *array = data->array;
  int i;
  for (i=start; i<stop;i++) {
    printf("%d %d\n",start,stop);
    array[i] = i*i;
  }
}

int main(void) {
  int array[ARRAYSIZE];
  int i, start, stop;
  struct ThreadData data;
  data.array = array;
  int tasksPerThread = (ARRAYSIZE+NUMTHREADS-1)/NUMTHREADS;


  for (i=0; i < NUMTHREADS; i++) {
    start = i * tasksPerThread;
    stop = (i+1) * tasksPerThread;
    data.start = start;
    if (stop >= ARRAYSIZE) {
      break;
    }
    data.stop = stop;

    squarer(&data);
  }
  for (i=0; i < ARRAYSIZE; i++) {
    printf("%d\n", i);
  }
 return 0;
}

我从其他一些答案中借用了代码