-1

自从我写完最后几行 C 以来已经有一段时间了,此时我在掌握 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

4 回答 4

1

首先,你没有二维数组,你有一个指针到指针。

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

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

float (*arr)[COLUMN_SIZE] = malloc(sizeof(*arr) * ROW_SIZE);
于 2013-07-24T13:14:16.827 回答
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));
    // ...
于 2013-07-24T13:16:09.123 回答
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) { ... }
于 2013-07-24T13:10:30.877 回答
0

您传递float *signal到那里read_signal_from_file()并重新分配signal,但这只会更改本地 var signal,而不是signals[i]in 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]

于 2013-07-24T13:17:00.257 回答