C 关闭for循环后,结构中的值将发生更改

C 关闭for循环后,结构中的值将发生更改,c,for-loop,struct,C,For Loop,Struct,简短版本:为什么(化合物+k)->光谱->峰值在for循环迭代后发生变化(在约2500种化合物中的4种) 长版本:我有一个函数,可以检查我的所有数据(在结构色谱图(chrom)中),并将type==1的数据直接添加到一个新结构(components),如果剩余数据中存在高度相似的色谱图,则检查类型==2的色谱图,并将其汇总/平均为化合物的1个条目。当我最初用当时的数据集编写这个程序时,它运行得很好,但在最近的数据中,我遇到了一个错误,即跟踪一个频谱中有多少“值”的整数在包含的for循环结束后以某

简短版本:为什么
(化合物+k)->光谱->峰值在
for
循环迭代后发生变化(在约2500种化合物中的4种)

长版本:我有一个函数,可以检查我的所有数据(在结构色谱图(
chrom
)中),并将
type==1
的数据直接添加到一个新结构(
components
),如果剩余数据中存在高度相似的色谱图,则检查
类型==2
的色谱图,并将其汇总/平均为
化合物的1个条目。当我最初用当时的数据集编写这个程序时,它运行得很好,但在最近的数据中,我遇到了一个错误,即跟踪一个频谱中有多少“值”的整数在包含的
for循环结束后以某种方式重置为0。我希望在阅读了我的代码之后,它会变得更清晰一些(特别注意最后的两张照片,它们演示了这个问题)

数组中的值甚至似乎会根据此操作的结果进行更改

4个特殊值周围的值保持正确,但是:

735: values [ 44801 ] contains a value set [ 556.250000 - 0.000000 ]
736: values [ 16481 ] contains a value set [ 765.000000 - 0.000000 ]
737: values [ 131848 ] contains a value set [ 765.000000 - 0.000000 ]
BREAKPOINT
735: values [ 44801 ] contains a value set [ 556.250000 - 0.000000 ]
736: values [ 0 ] contains a value set [ 765.000000 - 905.625000 ]
737: values [ 131848 ] contains a value set [ 765.000000 - 0.000000 ]
如果有人对下一步要检查的内容有任何点击或提示,我将不胜感激

--五月十六日(4:20)--

我试图通过向代码中添加
if(I==806){break;}
来手动中断特定
I
值处的for循环,从而查看数据的变化。这产生了:

736: values [ 16481 ] contains a value set [ 765.000000 - 0.000000 ]
BREAKPOINT
736: values [ 0 ] contains a value set [ 765.000000 - 905.625000 ]
--5月17日--

我还检查了I和k计数器是否做了一些奇怪的事情,但它们看起来非常好(在for循环中):

看看这个:

chromatogram* compounds;
compounds = calloc(MAX_SPECTRA,sizeof(compound));

你的意思可能是
sizeof(色谱图)
?或者
component*components

可能是您更改了
(components+k)->光谱->峰值的值吗

size = (compounds+k)->spectra->peaks + (chrom+j)->spectra->peaks;
(compounds+k)->spectra->peaks = size;

size
变量是一个
int
,这可能与您的问题有关。

我在添加过去分配给spectra的空间(在photo finish评论的部分中),我本来希望valgrind给出一个写过去缓冲区的消息,但我得到的错误后来没有无效指针


通过增加
MAX\u PEAKS

的值,问题得以解决。没有人希望这里有一段是问题。请确保你只写你想问的内容。如果问题简单,我会选择最短的方式(但不是完全正确)将是我添加为TL:dr的部分也许您还应该交叉检查
printf(“%i:%i\n”,k-1,(化合物+k-1)->光谱->峰值)循环内和
printf(“%i:%i\n”,i,(化合物+i)->光谱->峰值)断点引用数组中的相同位置后,数组中奇怪值的值发生了更改,但是前后数组中的值是正确的(即扫描复合735和737在两个priint中是相同的)。这应该是第一个是,但这不是我遇到的“问题”的原因(仍然是+1,用于发现不一致性)。不,peaks是一个int,用于跟踪有多少光谱。您列出的区块应该添加2个int,因为我将属于(chrom+j)的整个光谱添加到(化合物+k)啊,对不起,代码有点难理解!我现在看到了。我希望我最初问题中的“长版本”清楚地说明了它应该做什么:(
I: 803  K: 734
I: 804  K: 735
I: 805  K: 736 /* The iteration which shows wrong data AFTER the for loop closes */
I: 806  K: 737
I: 807  K: 738
I: 808  K: 739
chromatogram* compounds;
compounds = calloc(MAX_SPECTRA,sizeof(compound));
size = (compounds+k)->spectra->peaks + (chrom+j)->spectra->peaks;
(compounds+k)->spectra->peaks = size;