使用结构数组的分段错误
Segmentation fault using arrays of structs
我正在尝试用 c 编写一个排序程序。特别是桶排序。无论如何,我将原始数组中的值输入到我的存储桶 (Canasta) 结构中,无论我尝试过什么,我都会遇到分段错误。我也在这里阅读了另一个类似的问题并尝试了它所说的但是它不起作用。
构建:gcc sort.c -o 排序
运行 测试:$ ./sort 5
必须创建的桶数为 5
更新:我忘记在这一节中评论哪一行产生了错误。我添加了丢失的代码。谢谢。
第 78 行错误:basket[numcan].entrada[acum[numcan]] = lista[i];
这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#define MAX 200
#define HOLGURA 50
typedef struct intervalo{
int inf;
int sup;
} Intervalo;
typedef struct canasta{
Intervalo inter;
int *entrada;
int size;
} Canasta;
Canasta crearCanasta(Intervalo inter, int size){
Canasta *basket = NULL;
basket = (Canasta*)malloc(sizeof(Canasta));
basket->entrada = malloc(size * sizeof(int));
basket->inter = inter;
return *basket;
}
int * generarLista(){
static int lista[MAX];
time_t t;
/* Inicializa seed de rand() */
srand((unsigned) time(&t));
for(int i = 0; i < MAX; i++){
lista[i] = rand() % 200; // Random de 0 a 999
printf("lista: %d. ", lista[i]);
}
return lista;
}
int determinarCanasta(Intervalo * inter, int numhilos, int num){
for(int i = 0; i < numhilos; i++){
if(num > inter[i].inf && num < inter[i].sup)
return i;
}
}
Intervalo * crearIntervalo(int tamArr, int numhilos){
Intervalo *aux = malloc(numhilos*sizeof(Intervalo));
aux[0].inf = 0;
aux[0].sup = tamArr + HOLGURA;
for (int i = 1; i < numhilos; i++){
aux[i].inf = tamArr*i + HOLGURA;
aux[i].sup = tamArr*(i+1) + HOLGURA;
}
return aux;
}
int main(int argc, char const *argv[]){
int *lista = generarLista();
printf("Paso la generacion de lista\n");
int salida[MAX];
if(argv[1] > 0){
int tamArr = MAX / atoi(argv[1]); // Tamaño maximo del arreglo
Intervalo *inter = crearIntervalo(tamArr, atoi(argv[1])); // Arreglo de intervalos
printf("Paso generacion de intervalos\n");
Canasta *basket = malloc(atoi(argv[1]) * sizeof(Canasta)); // Arreglo de canastas
printf("Paso asignacion de memoria de canastas\n");
int numcan = 0;
int acum[atoi(argv[1])];
int array[atoi(argv[1])][tamArr + HOLGURA];
for (int i = 0; i < atoi(argv[1]); i++){
basket[i] = crearCanasta(inter[i], atoi(argv[1]));
acum[i] = 0;
}
for(int i = 0; i < MAX; i++){
numcan = determinarCanasta(inter, atoi(argv[1]), lista[i]);
basket[numcan].entrada[acum[numcan]] = lista[i]; // This line makes the error
printf("%d. ", numcan);
// I also tried to make an auxiliary bidimensional array to store the values but I get the same error
//array[numcan][acum[numcan]] = lista[i];
acum[numcan]++;
}
printf("Paso determinacion de canasta\n");
}
else{
printf("ERROR: Ingresa un numero valido de canastas");
exit(0);
}
}
如有任何帮助,我将不胜感激:)
从我在代码中看到的情况来看,当 determinarCanasta
函数在迭代中从未 returns 一个 i
值时,就会发生段错误。很难理解您期望的行为,但如果您更改为 if (num >= inter[i].inf && num <= inter[i].sup)
(使用 <=
和 >=
),它会正确找到一个间隔。另一种解决方案是定义在这种情况下要返回的默认值。
int determinarCanasta(Intervalo * inter, int numhilos, int num){
for (int i = 0; i < numhilos; i++) {
if (num >= inter[i].inf && num <= inter[i].sup)
return i;
}
// return some value
return DEFAULT_VALUE;
}
我正在尝试用 c 编写一个排序程序。特别是桶排序。无论如何,我将原始数组中的值输入到我的存储桶 (Canasta) 结构中,无论我尝试过什么,我都会遇到分段错误。我也在这里阅读了另一个类似的问题并尝试了它所说的但是它不起作用。
构建:gcc sort.c -o 排序
运行 测试:$ ./sort 5
必须创建的桶数为 5
更新:我忘记在这一节中评论哪一行产生了错误。我添加了丢失的代码。谢谢。
第 78 行错误:basket[numcan].entrada[acum[numcan]] = lista[i];
这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#define MAX 200
#define HOLGURA 50
typedef struct intervalo{
int inf;
int sup;
} Intervalo;
typedef struct canasta{
Intervalo inter;
int *entrada;
int size;
} Canasta;
Canasta crearCanasta(Intervalo inter, int size){
Canasta *basket = NULL;
basket = (Canasta*)malloc(sizeof(Canasta));
basket->entrada = malloc(size * sizeof(int));
basket->inter = inter;
return *basket;
}
int * generarLista(){
static int lista[MAX];
time_t t;
/* Inicializa seed de rand() */
srand((unsigned) time(&t));
for(int i = 0; i < MAX; i++){
lista[i] = rand() % 200; // Random de 0 a 999
printf("lista: %d. ", lista[i]);
}
return lista;
}
int determinarCanasta(Intervalo * inter, int numhilos, int num){
for(int i = 0; i < numhilos; i++){
if(num > inter[i].inf && num < inter[i].sup)
return i;
}
}
Intervalo * crearIntervalo(int tamArr, int numhilos){
Intervalo *aux = malloc(numhilos*sizeof(Intervalo));
aux[0].inf = 0;
aux[0].sup = tamArr + HOLGURA;
for (int i = 1; i < numhilos; i++){
aux[i].inf = tamArr*i + HOLGURA;
aux[i].sup = tamArr*(i+1) + HOLGURA;
}
return aux;
}
int main(int argc, char const *argv[]){
int *lista = generarLista();
printf("Paso la generacion de lista\n");
int salida[MAX];
if(argv[1] > 0){
int tamArr = MAX / atoi(argv[1]); // Tamaño maximo del arreglo
Intervalo *inter = crearIntervalo(tamArr, atoi(argv[1])); // Arreglo de intervalos
printf("Paso generacion de intervalos\n");
Canasta *basket = malloc(atoi(argv[1]) * sizeof(Canasta)); // Arreglo de canastas
printf("Paso asignacion de memoria de canastas\n");
int numcan = 0;
int acum[atoi(argv[1])];
int array[atoi(argv[1])][tamArr + HOLGURA];
for (int i = 0; i < atoi(argv[1]); i++){
basket[i] = crearCanasta(inter[i], atoi(argv[1]));
acum[i] = 0;
}
for(int i = 0; i < MAX; i++){
numcan = determinarCanasta(inter, atoi(argv[1]), lista[i]);
basket[numcan].entrada[acum[numcan]] = lista[i]; // This line makes the error
printf("%d. ", numcan);
// I also tried to make an auxiliary bidimensional array to store the values but I get the same error
//array[numcan][acum[numcan]] = lista[i];
acum[numcan]++;
}
printf("Paso determinacion de canasta\n");
}
else{
printf("ERROR: Ingresa un numero valido de canastas");
exit(0);
}
}
如有任何帮助,我将不胜感激:)
从我在代码中看到的情况来看,当 determinarCanasta
函数在迭代中从未 returns 一个 i
值时,就会发生段错误。很难理解您期望的行为,但如果您更改为 if (num >= inter[i].inf && num <= inter[i].sup)
(使用 <=
和 >=
),它会正确找到一个间隔。另一种解决方案是定义在这种情况下要返回的默认值。
int determinarCanasta(Intervalo * inter, int numhilos, int num){
for (int i = 0; i < numhilos; i++) {
if (num >= inter[i].inf && num <= inter[i].sup)
return i;
}
// return some value
return DEFAULT_VALUE;
}