2014-10-26 47 views
0

我不知道我的代碼有什麼問題。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) 

非常感謝您

+0

你似乎是一個索引過去的分配內存的結束。它看起來也許你試圖分配一個額外的元素,但'+ 1'是在你的malloc調用這個錯誤的地方。你可以考慮簡化你的例子來更清楚地展示問題。 – 2014-10-26 21:57:03

+0

爲什麼首先在'value'數組中添加一個額外的元素?你有一個'size'字段,表示有多少元素,你不需要結束標記。 – Barmar 2014-10-26 22:00:45

回答

2
vector.value = malloc(((size) * sizeof (double)) + 1); 

,對於size雙打加一個字節分配足夠的空間。

vector.value[size] = '\0'; 

這是一個問題。由於value的類型爲double*,因此解除引用會導致獲取或設置double值。您使用的字符文字類型爲int。它被隱含地轉換爲double,你寫過你分配的內存的末尾,結果是未定義的行爲。

也許你的意思是寫下面的內容,因爲你也可以在你的sort函數中索引數組的末尾。

vector.value = malloc((size + 1) * sizeof(double)); 
+0

哨兵值是多餘的,所以我建議完全刪除它(看起來代碼是從哨兵值轉換爲長度計數的一半) – 2014-10-26 23:29:04

0

應該是:

vector.value = malloc(size * sizeof(double) + sizeof(int)); 

和:

*((int *)(&vector.value[size])) = 0;