C:将数字5作为数组长度时出现问题

w9apscun  于 2022-12-17  发布在  其他
关注(0)|答案(3)|浏览(207)

我的朋友用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]);
    }
}

我试着在网上搜索,但无论我做什么,我真的不能把我的头上发生了什么。

wxclj1h5

wxclj1h51#

编辑:的确,为5保留内存,然后少用1来迭代,就像评论提到的那样!你想要5,所以它会从0到4。(1,2,3,4,5)
所以这个:

scanf("%d", &length);
length -= 1;
int X[length], Y[length];

应改为

scanf("%d", &length);    
int X[length], Y[length];    
length -= 1;

或者不减少长度,并在for循环中使用

for (int i = 0; i < length; i++)

在我前面的答案之前,使用malloc可以使它工作,但是,具有正确的输出并不一定意味着它是正确的:

scanf("%d", &length);
length -=1;
//int X[length], Y[length];
int *X, *Y;
X,Y = (int *) malloc(length);

在那之后,以5:

What is the length of your array?: 5
What are the elements of your array?: 
1
2
3
4
5

1 2 3 4 5 
5 4 3 2 1
vlf7wbxs

vlf7wbxs2#

数组的大小不足。
根据你的密码:

// Input length is 5
length -= 1; // The length is 4
int X[length], Y[length];
for (int i = 0; i <= length; i++)  // i -> 0 to 4, loop 5 times, but size of array is 4
    {
        scanf("%d", &X[i]);
        Y[i] = X[i];
    }

因此,交换两行是正确。

int X[length], Y[length];
length -= 1;
oxcyiej7

oxcyiej73#

您似乎混淆了长度和偏移量。length -= 1将导致XY的分配太小,所以当你向后迭代Y时,你很可能会找到X的最后一个元素的位置,你看到它有5个元素的原因可能是因为你的编译器中有32位对齐(4字节)。您可能会在9、13等处看到相同的内容。
但是这在内存对齐方面非常依赖于编译器/平台。任何偏移量超过数组边界的操作都将导致未定义的行为。
如果您将length -= 1移到XY声明之后,它应该可以工作,但这通常不是好的/首选的实践。
或者删除length -= 1并在最后一个循环中将循环中的长度比较改为i < lengths, and int i = length - 1 '。这通常是C语言中的首选样式。

相关问题