我在使用此阵列时遇到了问题' Vector'。
它没有从该功能返回' generateVector'内部具有相同的值。我认为返回语句会引发某种内存错误。 但我不知道怎么解决这个问题。
#include<stdio.h>
#include<time.h>
#include"meft_ist.h"
#define LOGMESSAGE "Error. Try again: "
enum { EXIT, GENERATE, SHOW, SAVE };
double *generateVector( int size, int max ) {
usint i;
// vector[0] transports array size
double vector[size + 1];
vector[0] = size;
for(i = 1; i < size; i++)
vector[i] = ( (double)rand() * max / (double)RAND_MAX ) + drand48();
/* for(i = 1; i < (int)vector[0]; i++) -> here the vector is OKAY
fprintf(stdout, "\n[%d] %.3lf", i, vector[i]);*/
line(1, 1);
fprintf(stdout, "** SUCCESS **");
return vector;
}
void save(void) {
FILE *f_data = fopen("savedata.txt", "rt");
if
fclose(f_data);
}
void showVector(double vector[]) {
usint i;
// -> here the vector IS CHANGED
line(2, 0);
for(i = 1; i < (int)vector[0]; i++)
fprintf(stdout, "[%2.d] %.3lf%c", i, vector[i], (i % 5 == 0) ? '\n' : '\t');
line(2, 0);
}
int exitProg() {
fprintf(stdout, "[EXIT] Confirm? [y/n]");
switch(getchar()) {
case 's': case 'S':
case 'y': case 'Y':
line(2, 1);
fprintf(stdout, "** THANKS **");
line(1, 0);
return false;
default:
return true;
}
}
int interface() {
double *vector;
//clear();
menu(4, "Generate", "Show", "Regist", "Exit");
line(1, 1);
sint option = (sint) i_dialog("Choice: ", LOGMESSAGE);
switch(option) {
case GENERATE:
vector = generateVector(abs(i_dialog("Size: ", LOGMESSAGE)),
i_dialog("Max: ", LOGMESSAGE));
case SHOW:
showVector(vector);
break;
case SAVE:
save();
break;
case EXIT:
return exitProg();
default:
return false;
}
}
int main() {
srand( (unsigned)time(NULL) );
while(interface());
return 0;
}
答案 0 :(得分:4)
您正在返回指向automatic variable的指针。函数返回时变量超出范围,留下dangling pointer。使用该指针执行任何操作都会导致undefined behaviour。
该函数需要获取指向(预分配)数组的指针,或者在堆上分配一个新数组并返回该数组。