gpt4 book ai didi

c - 注释如何改变程序的输出?

转载 作者:行者123 更新时间:2023-11-30 21:35:31 24 4
gpt4 key购买 nike

我只是C语言的新手。我正在使用 code6.4 来练习 C。请参阅后面的代码。

int main(int argc, const char * argv[]) {
int a[5]={1,4,7,3,5};

merge(a, 0, 2, 4);
printf("%d",a[4]);

return 0;
}

void merge(int *a ,int p ,int q,int r){
int n1,n2;
n1=q-p+1;
n2=r-q;
int temp1[n1];
int temp2[n2];
int i,j,k;
for (i=0; i<n1; i++) {
temp1[i]=a[p+i];
}
for (i=0; i<n2; i++) {
temp2[i]=a[q+1+i];
}
j=0;
k=0;
for (i=p; i<=r; i++) {
if (temp1[j]<temp2[k]) {
a[i]=temp1[j];
j++;
}
else{
a[i]=temp2[k];
k++;
}
}
printf("%d ",a[4]);
}

所以输出是:

7 7

我已上传屏幕截图。

http://i.stack.imgur.com/AfhFD.png

但是当我注释掉第二个 printf 时:

 for (i=p; i<=r; i++) {
if (temp1[j]<temp2[k]) {
a[i]=temp1[j];
j++;
}
else{
a[i]=temp2[k];
k++;
}
}
//printf("%d ",a[4]);

第一个 printf 的输出已更改。如下图所示。

-1231562870

http://i.stack.imgur.com/9NPlw.png

我知道这可能很荒谬,但是有人可以帮助我吗?

最佳答案

您的程序在此处调用未定义的行为:

if (temp1[j]<temp2[k]) { ... }

在您的具体示例中,当 i == r 时会发生这种情况,因为您将比较 temp1[2]temp2[2],但 temp2 只有 2 个元素,因此这是越界访问。

尝试用 UB 来推理程序是不被允许的;修正错误,这样你就不会再遇到其他意外了。

一个可能的解决方法是将最后一个循环更改为:

for (i=p; i<=r; i++) {
if (k < n2 && j < n1) {
if (temp1[j] < temp2[k]) {
a[i] = temp1[j];
j++;
} else {
a[i] = temp2[k];
k++;
}
} else if (k < n2) {
a[i] = temp2[k];
k++;
} else {
a[i] = temp1[j];
j++;
}
}

关于c - 注释如何改变程序的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32414326/

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