我的朋友用C编写了一个程序,它有两个输入。一个是数组的长度,另一个是数组的元素。除了数组的长度为5时,代码运行良好。当数组的长度为5时,数组中的第一个元素与最后一个元素相同(例如,如果元素是1,2,3,4,5,那么它将被切换为5,2,3,4,5)。以下是他写的代码:
#include <stdio.h>
int main()
{
int length;
printf("What is the length of your array?: ");
scanf("%d", &length);
length -= 1;
int X[length], Y[length];
printf("What are the elements of your array?: \n");
for (int i = 0; i <= length; i++)
{
scanf("%d", &X[i]);
Y[i] = X[i];
}
printf("\n");
for (int i = 0; i <= length; i++)
{
printf("%d ", X[i]);
}
printf("\n");
for (int i = length; i >= 0; i--)
{
printf("%d ", Y[i]);
}
}
我试着在网上搜索,但无论我做什么,我真的不能把我的头上发生了什么。
3条答案
按热度按时间wxclj1h51#
编辑:的确,为5保留内存,然后少用1来迭代,就像评论提到的那样!你想要5,所以它会从0到4。(1,2,3,4,5)
所以这个:
应改为
或者不减少长度,并在for循环中使用
在我前面的答案之前,使用malloc可以使它工作,但是,具有正确的输出并不一定意味着它是正确的:
在那之后,以5:
vlf7wbxs2#
数组的大小不足。
根据你的密码:
因此,交换两行是正确。
oxcyiej73#
您似乎混淆了长度和偏移量。
length -= 1
将导致X
和Y
的分配太小,所以当你向后迭代Y
时,你很可能会找到X
的最后一个元素的位置,你看到它有5个元素的原因可能是因为你的编译器中有32位对齐(4字节)。您可能会在9、13等处看到相同的内容。但是这在内存对齐方面非常依赖于编译器/平台。任何偏移量超过数组边界的操作都将导致未定义的行为。
如果您将
length -= 1
移到X
和Y
声明之后,它应该可以工作,但这通常不是好的/首选的实践。或者删除
length -= 1
并在最后一个循环中将循环中的长度比较改为i < lengths, and
int i = length - 1 '。这通常是C语言中的首选样式。