https://en.wikipedia.org/wiki/Set_cover_problem大小为8的无效读取,在0x400886:set_random_fill(app.c:60)
有简单的任务,但我不知道如何把它写正确的C89。
valgrind
说有在行错误60
enter universe size:
22
==18369== Invalid read of size 8
==18369== at 0x400886: set_random_fill (app.c:66)
==18369== by 0x4007EE: main (app.c:42)
==18369== Address 0x8 is not stack'd, malloc'd or (recently) free'd
这里是代码(我用clang
)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct {
int size;
int *array;
} set ;
typedef struct {
int size;
set *array;
} set_collection;
void
set_allocate(set *allocatable_set, int numbers_amount);
void
set_random_fill(set *initializable_set);
void
set_print(set *printable_set);
int
main(void)
{
int universe_size = 0;
set *universe = NULL;
srand((unsigned int)time(NULL));
puts("enter universe size:");
scanf("%d", &universe_size);
set_allocate(universe, universe_size);
set_random_fill(universe);
set_print(universe);
free(universe);
return 0;
}
void
set_allocate(set *allocatable_set, int numbers_amount)
{
allocatable_set = malloc(sizeof(set));
allocatable_set -> size = numbers_amount;
allocatable_set -> array = calloc(
(unsigned long) numbers_amount, sizeof(int)
);
}
void
set_random_fill(set *initializable_set)
{
int set_element_cursor = 0;
int set_elements_amount = 0;
int *set_elements_array = NULL;
set_elements_array = initializable_set -> array;
set_elements_amount = initializable_set -> size;
while (set_element_cursor < set_elements_amount) {
set_elements_array[set_element_cursor] = rand() % 100;
++set_element_cursor;
}
}
void
set_print(set *printable_set)
{
int set_size = 0;
int set_element_cursor = 0;
int *set_elements_array = NULL;
set_size = printable_set -> size;
set_elements_array = printable_set -> array;
while (set_element_cursor < set_size) {
printf("%d ", set_elements_array[set_element_cursor]);
++set_element_cursor;
}
}
哪里是什么问题?
'设置*宇宙= NULL称之为;' - >'设置*宇宙= malloc的(的sizeof(组));'代替'allocatable_set = malloc的(的sizeof(集));'。 ''int * array'也需要'free''' – BLUEPIXY
根据“fail fast”策略,最好在另一个函数中分配,不是吗? –
你应该按照你的意愿去做。 – BLUEPIXY