C:传递2D阵列的一个维度会导致段错误

时间:2013-07-24 13:07:49

标签: c multidimensional-array initialization segmentation-fault

自从我写完最后一行C以来,已经有一段时间了,此时此刻我遇到了问题。我想这可能是我犯的一个愚蠢的错误,但在研究了这个问题一段时间后,我仍然无法弄清楚我做错了什么。这就是我的代码的样子:

int read_signal_from_file(const char* path, float* signal, SF_INFO * info) {
    SNDFILE *sndFile;
    sndFile = sf_open(path, SFM_READ, info);
    signal = malloc(info->frames * sizeof(float));
    long numFrames = sf_readf_float(sndFile, signal, info->frames);
    ...
}

int main(int argc, char *argv[]) {
    float** signals = malloc(NUM_FILES * sizeof(float*));
    float avg = 0.0;
    SF_INFO tmp_info;
    for(int i = 0; i < NUM_FILES; i++) {
        read_signal_from_file(INPUT_FILES[i], signals[i], &tmp_info);
        for(long j = 0; j < tmp_info.frames; j++) {
            printf("Sample no #%ld: %f\n", j, signals[i][j]);
        }
    }
}

read_signal_from_file()内部,我没有麻烦访问分配的内存部分。但是,只要我尝试从主函数的范围访问它(例如上面的printf()示例,我就会得到损坏的结果,看起来像未初始化的内存或溢出。如果我尝试操作这些数据(例如通过调用vDSP_meanv(),应用程序崩溃了。

4 个答案:

答案 0 :(得分:1)

首先,你没有2D数组,你有一个指针指针。

然后,指针本身并没有指向任何东西,它们是未初始化的,因为你没有为它们分配内存 - 因此你的程序会调用未定义的行为。

因此,要么在for循环中使用malloc()为它们分配内存,要么更好,使用真正的数组:

float (*arr)[COLUMN_SIZE] = malloc(sizeof(*arr) * ROW_SIZE);

答案 1 :(得分:0)

您正在分配指针数组,但您没有将它们设置为任何内容:

float** signals = malloc(NUM_FILES * sizeof(float*));

这意味着您在此处传递未初始化的指针(signals[i]):

read_signal_from_file(INPUT_FILES[i], signals[i], &tmp_info)

因为signals[i]是按值传递的,所以它不会在函数调用中被更改,因此在read_signal_from_file返回后它仍将是未初始化的。

一个简单的改变是通过引用传递:

int read_signal_from_file(const char* path, float* &signal, SF_INFO * info) { ... }

答案 2 :(得分:0)

(如上所述)您正在分配signals指针数组,但是您没有在此数组中分配指针。在signal中分配read_signal_from_file时,您确实保留了内存,但是您将指针指定给本地 signal变量。如果要将分配的signal分配给signals函数中的main数组,则应该将指针传递给指针:

read_signal_from_file(INPUT_FILES[i], &signals[i], &tmp_info);

并更改您的read_signal_from_file功能以接受它:

int read_signal_from_file(const char* path, float ** signal, SF_INFO * info) {
    // ...
    *signal = malloc(info->frames * sizeof(float));
    // ...

答案 3 :(得分:0)

您将float *signal传递给read_signal_from_file()并重新分配signal,但这只会更改signal中的本地变量signals[i],而不是main()。 将read_signal_from_file()的签名更改为

int read_signal_from_file(const char* path, float** signal, SF_INFO * info)

将您的malloc()更改为

*signal = malloc(info->frames * sizeof(float));

并传递signals+i而不是signals[i]