繁体   English   中英

C:malloc,结构错误

[英]C: malloc, structure error

我不知道我的代码有什么问题。

这似乎与内存访问有关,但是我找不到什么或为什么。 我将不胜感激。

码:

#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)

非常感谢你

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

这样就为双倍size加上一个字节分配了足够的空间。

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

这是个问题。 因为valuedouble*类型的,所以取消引用它会导致获取或设置double值。 您使用字符文字,其类型为int 它隐式转换为double ,您在分配的内存末尾写入,结果是未定义的行为。

也许您打算编写以下内容,因为您还索引了sort函数中数组的末尾。

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

应该:

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

和:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM