问题描述
我有一个脚本,可以通过使用函数来填充数组,也可以不使用函数。
它接受一个参数readmode
,它决定是否使用该函数;还有一个参数len_arr
,它决定了数组的长度。
我简化了代码,以便每次迭代时数组长度每次迭代都会增加,但是在实际情况下,每次迭代都会加载音频文件,以使它们具有不同的长度,因此我使用malloc进行初始化,然后我将其释放一次完成了后处理。
主脚本
// imports
#include <iostream> /* cout */
#include <stdio.h> /* printf */
#include <stdlib.h> /* atoi */
using namespace std;
void function_1(int len_arr,double * output_buffer){
for (int j=0; j<len_arr; ++j){
output_buffer[j] = 1.0*j;
}
}
int main (int argc,char ** argv) {
int readmode = atoi(argv[1]);
// double *buffer;
// cout << "1 : Memory Address of buffer="<<buffer << endl;
for (int len_arr=1; len_arr<=5; ++len_arr){
if (readmode==1){
double *buffer = (double *)malloc(len_arr * sizeof(double));
function_1(len_arr,(double*)buffer);
cout << "\n2 : Memory Address of buffer="<<buffer << endl;
printf("readmode=1 : buffer[:5]=[%f %f %f %f %f]\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4]);
} else if (readmode==2){
double *buffer = (double *)malloc(len_arr * sizeof(double));
for (int j=0; j<len_arr; ++j){
buffer[j] = 1.0*j;
}
cout << "\n3 : Memory Address of buffer="<<buffer << endl;
printf("readmode=2 : buffer[:5]=[%f %f %f %f %f]\n",buffer[4]);
}
/* Do my post-processing with buffer */
// verbose
cout << "\n4 : Memory Address of buffer="<<buffer << endl;
printf("readmode=%i : buffer[:5]=[%f %f %f %f %f]\n",readmode,buffer[4]);
free(buffer);
}
return 0 ;
}
我这样编译它
g++ -o ./debug_ifelse.out -Ofast -Wall -Wextra -std=c++11 "./debug_ifelse.cpp"
这是我面临的问题:
- 如果我在输入if-else之前未初始化
double *buffer
,则即使没有在每个条件中都定义它,也会收到未声明的编译错误。
./debug_ifelse.cpp: In function ‘int main(int,char**)’:
./debug_ifelse.cpp:41:48: error: ‘buffer’ was not declared in this scope
cout << "\n4 : Memory Address of buffer="<<buffer << endl;
^
./debug_ifelse.cpp: At global scope:
./debug_ifelse.cpp:14:15: warning: unused parameter ‘argc’ [-Wunused-parameter]
int main (int argc,char ** argv) {
^
- 当我初始化它时(尽管我看不到它的含义),if-else之外和之内的变量
double *buffer
似乎位于不同的内存地址中,并且我无法访问其中定义的变量if-else。
1 : Memory Address of buffer=0
2 : Memory Address of buffer=0x24f3030
readmode=1 : buffer[:5]=[0.000000 0.000000 0.000000 0.000000 0.000000]
4 : Memory Address of buffer=0
Segmentation fault
解决方法
取消注释// // * buffer;应该在for循环的上方定义缓冲区。
double *buffer;
在if-else块中,仅使用缓冲区而不定义缓冲区。
buffer = (double *)malloc(len_arr * sizeof(double));
,
读取错误:
./debug_ifelse.cpp: In function ‘int main(int,char**)’:
./debug_ifelse.cpp:41:48: error: ‘buffer’ was not declared in this scope
cout << "\n4 : Memory Address of buffer="<<buffer << endl;
看看第41行-您使用变量buffer
,因此,如果在第40行中将其注释掉,则不会在范围内声明它-就像错误所示。
请注意,如果确实在第40行声明了它,那么此行。
double *buffer = (double *)malloc(len_arr * sizeof(double));
创建另一个(不同的)同名变量(可能不想使用)。使其buffer = (double *)malloc(len_arr * sizeof(double));
请注意,您确实需要在第40行上使用buffer
,因为在free(buffer)
循环之后,因此在该范围内是必需的。
旁注:
- 因为您的循环一直在说
buffer = malloc(...
,您在泄漏 记忆 - 如果您使用的是C ++,为什么要使用malloc / free而不是new / delete?