Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构问题中的指针。我做对了吗?_C - Fatal编程技术网

C 结构问题中的指针。我做对了吗?

C 结构问题中的指针。我做对了吗?,c,C,我正在重写一些代码,使其具有指向指针在结构中的位置的常规指针 这是工作的原始代码: int wrote = sf_writef_double(outfile, *mono_channel, frames); 在新代码中,我将mono_通道指针放在一个struct中,我写了什么 int wrote = sf_writef_double(outfile, data->mono_channel, frames); 编译器没有抱怨,但程序崩溃了 所以问题是。数据->单声道是否与*单声道相同 拥

我正在重写一些代码,使其具有指向指针在结构中的位置的常规指针

这是工作的原始代码:

int wrote = sf_writef_double(outfile, *mono_channel, frames);
在新代码中,我将mono_通道指针放在一个struct中,我写了什么

int wrote = sf_writef_double(outfile, data->mono_channel, frames);
编译器没有抱怨,但程序崩溃了

所以问题是。
数据->单声道
是否与
*单声道
相同

拥抱, 路易丝

编辑: 更确切地说,我是这样做的:

ltfat_complex* fm;
fm = malloc(data->L * sizeof(ltfat_complex));
if (fm == NULL) { puts("fm malloc failed"); exit(1); }

/* Writes output to fm */      
idgt_fac(data->coef, gdf, data->L, 1, 1, data->a, data->M, fm);

free(data->mono_channel);

data->mono_channel = (double*) fm;
free(fm);

问题可能是,我试图重复使用
数据->单声道
指针

Edit2: 以下是完整的源代码(每行约700行):

有效的旧方法:

新的:

遗憾的是,它们需要大量的库来编译:来自SVN的ltfat、fftw3、lapack、blas、sndfile


但是有=)

您在第一个版本中取消了对单声道的引用,但在第二个版本中没有。试一试

int wrote = sf_writef_double(outfile, *(data->mono_channel), frames);

数据->单声道
(*数据)相同。单声道

如果您想要指向变量的内容,我建议您想要
*(数据->单声道)


您可能需要重新阅读K&R。

否,数据->单声道和*单声道不是一回事*(数据->单声道)与*单声道相同

我真的很想知道如果你想把一个指针传递给一个double而不是double,你是如何在程序中使用*mono_通道的。很明显,mono_通道是指向双精度向量的指针。最有可能的mono_通道是指向双精度数组(实际上是向量)的指针

double *mono_channel[1000];   // let's say

不管怎么说,如果你崩溃了,可能是因为你没有分配任何存储空间和指向它的mono_通道,相反,你只是将它定义为你的结构的一个成员,它是一个double*并且正在使用它。您需要将mono_通道指向预定义的全局数组,或者使用malloc/new分配它。

如果这样做,我会得到以下编译器错误:audio_save.c:25:error:sf_writef_double'/usr/include/sndfile-64的参数2的类型不兼容。h:517:注意:应为'const double*',但参数的类型为'double'make:**[audio\u save.o]错误1知道会出现什么问题吗?
mono\u channel
data->mono\u channel
的类型完全相同吗?int write=sf\u writef\u double(outfile,&data->mono\u channel,frames)抱歉,听起来你实际上有一个更深层次的问题。sf_writef_double到底期望什么-一个double数组,还是一个double?如果是数组,那么看看你是如何设置结构的-你可能需要它的成员是一个指向double的指针,并且需要像以前的普通指针一样分配该指针(即,在调用上述函数之前,需要在某个点为其分配double数组)是的,类型是相同的。两种类型都是双重的。但我尝试重新使用单声道指针,这可能就是问题所在?我已经在问题中添加了代码片段,并添加了整个源代码。对于这两种情况,每种情况都有约700行。重复使用指针合法吗?+1用于详细说明。(我的大脑现在因为整天和VBA一起工作而兴奋不已。)既然你提到了它,我也想知道它为什么在最初的版本中起作用。SND文件规格上写着:sf_计数sf_写入双帧(SND文件*SND文件,双帧*ptr,sf_计数帧);我已经链接到问题中的源代码,如果你能看到哪里出了问题吗?这里的问题是
free(fm)
。这也释放了
数据->单声道
,因此你以后不能使用它。哇!你是对的。这就解决了它=)非常感谢!我花了一整晚的时间来研究这个问题。我是Stack Overflow的新手。我能给你分数吗?不幸的是,没有办法给你分数来发表评论。而且他已经有了你能得到的唯一一个好评论的徽章。很抱歉,问了这些新手问题。在每个评论的左边都有一个向上的箭头。我应该clic吗每次我看到一条好的评论时,我都会这样做吗?我是否可以在答案上的向上箭头上单击任意次数?如果您喜欢,请单击向上箭头(一次)。有关该网站的任何其他问题都可以在此处询问:。
double *mono_channel[1000];   // let's say