自从我写最后几行 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()
,应用程序会因段错误而崩溃。
最佳答案
首先,你没有一个二维数组,你有一个指针到指针。
然后,指针本身不指向任何东西,它们未初始化,因为您没有为它们分配内存 - 因此您的程序会调用未定义的行为。
因此,要么在 for 循环中使用 malloc()
为它们分配内存,或者更好的是,使用真正的数组:
float (*arr)[COLUMN_SIZE] = malloc(sizeof(*arr) * ROW_SIZE);
关于C:传递二维数组的一维会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17834950/