从函数返回时C数组更改

时间:2014-10-20 21:32:06

标签: c arrays function pointers return

我在使用此阵列时遇到了问题' 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;
}

1 个答案:

答案 0 :(得分:4)

您正在返回指向automatic variable的指针。函数返回时变量超出范围,留下dangling pointer。使用该指针执行任何操作都会导致undefined behaviour

该函数需要获取指向(预分配)数组的指针,或者在堆上分配一个新数组并返回该数组。