我在Linux CentOS 64位计算机上有一个ANSI C程序,包含以下行:
H1_real = malloc(len_SPURFREQ_TIE * sizeof(double)); /* allocate memory */
H1_imag = malloc(len_SPURFREQ_TIE * sizeof(double)); /* allocate memory */
H2_real = malloc(len_SPURFREQ_TIE * sizeof(double)); /* allocate memory */
H2_imag = malloc(len_SPURFREQ_TIE * sizeof(double)); /* allocate memory */
H3_real = malloc(len_SPURFREQ_TIE * sizeof(double)); /* allocate memory */
H3_imag = malloc(len_SPURFREQ_TIE * sizeof(double)); /* allocate memory */
if ( (H1_real == NULL) || (H1_imag == NULL) || (H2_real == NULL) || (H2_imag == NULL) || (H3_real == NULL) || (H3_imag = NULL) ) {
exit(6);
}
当我使用gdb检查H1_real到H3_imag的分配地址时,它们看起来很好。if语句也执行得很好,因为没有触发exit(6)。但是在if语句执行之后检查H3_imag地址时,它现在读取0x0。有人知道会发生什么吗?
H3_imag = NULL
应该是:
H3_imag == NULL
将malloc
的返回值转换为适当的类型是一种很好的做法。例如:如果您的H1_real
的类型是double *,那么下面将是一个很好的。
H1_real = (double *) malloc(len_SPURFREQ_TIE * sizeof(double)); /* allocate memory */
同样适用于使用malloc
(返回void *)分配内存的所有变量。