gpt4 book ai didi

C: malloc,结构错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:35:07 25 4
gpt4 key购买 nike

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

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

代码:

#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 双倍加一个 byte 分配了足够的空间。

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

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

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

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

关于C: malloc,结构错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26578391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com