我不知道我的代碼有什麼問題。C:malloc,結構錯誤
這似乎是與內存訪問相關的東西,但我沒有找到什麼或爲什麼。 我將不勝感激。
代碼:
#include <stdio.h>
#include <time.h>
#include "ist.h"
#define LOGMESSAGE "Error. Try again: "
typedef struct {
usint size;
double *value;
} Vector;
void showVector(Vector vector);
/* generateVector(int, int) -> double*/
Vector generateVector(int max, int size) {
usint i;
Vector vector;
if(size == 0) {
fprintf(stdout, "1 element added to array\n");
vector.size = 1;
}
vector.value = malloc(((size) * sizeof (double)) + 1);
for(i = 0; i < size; i++) {
vector.value[i] = ((double)rand() * max/(double)RAND_MAX);
printf("\n%f\n", vector.value[i]);
}
vector.value[size] = '\0';
fprintf(stdout, "\nVector generated\n");
showVector(vector);
return vector;
}
/* save(double *) -> void*/
unsigned int save(Vector vector) {
sint i;
FILE *f_data = fopen("savedata.txt", "wt");
if(f_data == NULL) {
fprintf(stdout, "can't open file");
return 1;
}
for(i = 0; i < vector.size; i++)
fprintf(f_data, "%.3f\n", vector.value[i]);
fclose(f_data);
return 0;
}
/* showvector(double) -> void*/
void showVector(Vector vector) {
usint i;
line(2, 0);
for(i = 0; i < vector.size; i++)
fprintf(stdout, "[%2.d] %.3lf%c", i, vector.value[i],
(i % 5) ? '\t' : '\n');
line(2, 0);
}
/* sort(double*) -> double*/
Vector sort(Vector vector) {
sint i;
int change = true;
while(change == true) {
change = false;
for(i = 0; i < vector.size; i++)
if(vector.value[i + 1] > vector.value[i]) {
double temp = vector.value[i];
vector.value[i] = vector.value[i + 1];
vector.value[i + 1] = temp;
change = true;
}
}
showVector(vector);
return vector;
}
/* interface(void) -> int*/
int interface(char **argv) {
Vector vector;
clear();
fseek(stdin, 0, SEEK_END);
vector = (argv == NULL) ? generateVector(i_dialog("Max val: ", LOGMESSAGE),
i_dialog("Vector size: ", LOGMESSAGE))
: generateVector(atoi(argv[1]), atoi(argv[2]));
showVector(vector);
save(sort(vector));
free(vector.value);
fprintf(stdout, "Press <ENTER>...");
CLEARBUFF();
line(2, 1);
menu(2, "Repeat", "Exit");
return i_dialog("\nchoice: ", LOGMESSAGE) ? true : false;
}
int main(int argc, char **argv) {
srand((unsigned)time(NULL));
if(argc != 3)
argv = NULL;
while(interface(argv));
return 0;
}
輸出(錯誤):
Vector Size: 4
Max value: 5
0.659987
2.609337
2.122152
1.464432
s1e2: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted (core dumped)
非常感謝您
你似乎是一個索引過去的分配內存的結束。它看起來也許你試圖分配一個額外的元素,但'+ 1'是在你的malloc調用這個錯誤的地方。你可以考慮簡化你的例子來更清楚地展示問題。 – 2014-10-26 21:57:03
爲什麼首先在'value'數組中添加一個額外的元素?你有一個'size'字段,表示有多少元素,你不需要結束標記。 – Barmar 2014-10-26 22:00:45