-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(),应用程序崩溃,段错误

回答

1

首先,您没有2D阵列,你有一个指针到指针。

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

所以,无论是分配内存为他们在使用malloc() for循环,甚至更好,用一个真正的数组:

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

感谢您的快速答复!我感到非常愚蠢的问这样一个愚蠢的问题,但多亏了你,我不会再犯这个错误:) –

+0

@maxPlauth不要担心,有这样的方式更糟糕的问题。就像,大小的顺序更糟(当OP甚至没有关于他在做什么的最小想法时)。你的不是其中之一。 – 2013-07-24 14:35:32

0

您分配的指针数组,但你是不是将它们设置为任何事情:

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

这意味着要传递的未初始化的指针(signals[i])here:

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) { ... } 
0

(如前所述)你分配signals数组的指针,但你不分配这个数组中的指针。当您在read_signal_from_file中分配signal时,确实会保留内存,但您将指针分配给变量的本地signal变量。如果你想分配分配signalsignals阵列在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)); 
    // ... 
0

你传递float *signalread_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]