gpt4 book ai didi

C 奇怪的数组分配行为

转载 作者:太空宇宙 更新时间:2023-11-04 05:28:48 24 4
gpt4 key购买 nike

我将 xcode 与 c 结合使用,但我遇到以下代码的奇怪问题。

当算法到达我的 conv 函数中的 y[k] = 0.0 行然后 x 数组由 0-s 填充时,我必须明白为什么,我已经用我自己的方式纠正了这个错误。当我在主函数中注释第二行并取消注释第三行时,问题没有出现(见下文)。我知道我在 generateSquareSignal 中重新分配了数组,但我认为这不是这个错误的原因。

 int length = 100;
double *output = (double*) malloc(10 * length * sizeof(double));
//double *output;
output = generateSquareSignal(length);
double *input1 = (double*) malloc(length * sizeof(double));
double *input2 = (double*) malloc(length * sizeof(double));

for (int i = 0; i < length; i++) {
input2[i] = output[i];
input1[i] = output[i];
//printf("-%d=%lf\n",i ,input1[i]);
}

conv(input1, length, input2, length, output, 2 * length );


double* generateSquareSignal(int length) {

printf("double* generateSquareSignal(int length)\n");

double *signal = (double*) malloc(length * sizeof(double));

int length_period = length / kPeriodSignal;
for(int i=0; i < length; i++) {
if (i % (length_period) < (length_period / 2)) {
signal[i] = 1.0;
} else {
signal[i] = -1.0;
}
//printf("%d. - %lf\n", i, signal[i]);
}

return signal;
}



void conv( double *x, int N_signal,
double *h, int N_kernel,
double *y, int N_output) {
int k;
for(k = 0; k < N_signal + N_kernel; k++) {
y[k] = 0.0;
}

for (int i = 0; i < N_signal; i++) {
printf("%lf-%lf\n", x[i], y[i]);
}


for(int i = 0; i < N_signal; i++) {
for(int j = 0; j < N_kernel; j++) {
double xx = x[i];
double hh = h[j];
double yy = y[i + j];
y[i + j] += x[i] * h[j];
//printf("=%lf\n", y[i + j]);
}
}
}

最佳答案

您的问题出在这部分代码中(添加了行号)

 1 int length = 100;
2 double *output = (double*) malloc(10 * length * sizeof(double));
3 //double *output;
4 output = generateSquareSignal(length);
/* ... snipped line 5 to 12 */
13
14 conv(input1, length, input2, length, output, 2 * length );

在第 2 行中,您分配内存以容纳 1000 个 double 值。

在第 4 行中,您使用对包含 100 个 double 的缓冲区的引用覆盖对该内存的唯一引用。这会导致第 2 行中分配的内存发生内存泄漏。

在第 14 行中,您告诉 conv 函数变量 output(在 conv 中变为 y ) 可以存储 200 个 double 值(并且 conv 隐含地假定它至少可以在其中存储该数量的数据)。这是不正确的,因为它实际上指的是 100 个 double block 。结果是 conv 写入了 outputy 引用的缓冲区边界之外,这会导致未定义的行为。在您的情况下,未定义的行为恰好是溢出最终出现在下一个分配的内存块中,这是 input1x 引用的内存块.

最后,该错误的根本原因确实是在 generateSquareSignal 中进行的新分配覆盖了之前为 output 分配的分配。

关于C 奇怪的数组分配行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13650264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com