C:传递二维数组的一维会导致段错误

标签 c multidimensional-array initialization segmentation-fault

自从我写最后几行 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/

相关文章:

c - 为什么在 main() 之后有函数定义?

c - 如何在 C 中设置主目录和路径目录?

C 将动态字符数组转换为字符数组

c - 如何在C/C++中将二维数组的指针赋给内存地址

python - 简单问题 : In numpy how do you make a multidimensional array of arrays?

excel - 用 Range 初始化 vba 类成员变量

c - 关于 "C"中的 Prime Generation - 我的代码有什么问题? -

c - 将指向 void* 的指针传递给 pthread_join 的目的是什么?

c++ - 未初始化的 boolean 变量不一致

c++ - 使用模板编译时计算使用 const 值初始化数组