自从我写完最后一行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()
,应用程序崩溃了。
答案 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]