打印降序数组 C

Print descending array C

我必须为打印数组创建函数,用降序数字填充数组。

我创建了用于打印数组和创建降序的函数 array.But 我遇到了问题。 如果我使用自己的函数 printArray() 它会打印出一些不清楚的东西。问题出在哪里,我做错了什么? 请帮忙

这是 C 中的代码。value - 是数组的值

打印数组的函数:

void printArray (int arr[]){
   int i;
   printf("\n");
     for(i = 0; i < value; i ++)
       printf("%3d ", arr[i]);
}

创建降序数组的函数:

int createDescendingArray(int a[])
{
    int i;
    printf("\nDescending array is created.\n");
    for (i = value; i > 0; i--) {   
        a[i] = i;
    }
  printArray(a); // print of created array
}

主要功能:

int main(){
int arr1[value]; //create new array
arr1[value] = createDescendingArray (arr1); //fill array with descending numbers
}

然而,当我不在函数 createDescendingArray() 中使用我的打印函数并使用如下标准方法在 Main 函数中打印它时:

{int i;
 for(i = 0; i < value; i++)
 {
 a[i]=i;
 printf("%3d", a[i]);
 }
}

将降序数组显示为升序(看图) 它是如何工作的?

您一直在打印数组的函数中使用名为 value 的变量,但未对其进行初始化,因此是垃圾值。

您应该在函数中对其进行初始化或将其起始值作为参数传递给函数。

#include <stdio.h>
#include <stdlib.h>

void printArray(int *arr, int length)
{
    int i;
    printf("\n");
    for (i = 0; i < length; i++)
    {
        printf("%3d ", arr[i]);
    }
}

int *createDescendingArray(const int length)
{
    if (length == 0)
        return NULL;
    int *a = malloc(length * sizeof(int));
    ;
    printf("\nDescending array is created.\n");
    for (int i = length-1; i >= 0; i--)
    {
        a[i] = i;
    }
    printArray(a, length); // print of created array
    return a;
}

int main()
{
    int *a = createDescendingArray(20);
    printArray(a, 20);
    return 0;
}

这些更改很可能可以解决问题,但同样,在创建数组的函数中也没有初始化值

编辑:如果长度为 0,则停止创建数组

EDIT2:修复了将 0 视为元素的代码

EDIT3:根据@CraigEstey 在评论中提出的建议修复了代码,经过测试和工作

EDIT4:修复了 for 循环并移除了 mallock 上的强制转换

函数

int createDescendingArray(int a[])
{
    int i;
    printf("\nDescending array is created.\n");
    for (i = value; i > 0; i--) {   
        a[i] = i;
    }
    printArray(a); // print of created array
}

错了。

根据您问题的输出,您似乎已将 value 定义为 4(您没有向我们展示带有定义的代码)。在这种情况下,上述函数的代码等同于以下内容:

int createDescendingArray(int a[])
{
    printf("\nDescending array is created.\n");

    a[4] = 4;
    a[3] = 3;
    a[2] = 2;
    a[1] = 1;

    printArray(a); // print of created array
}

除了展开循环外,我没有对代码做任何其他事情。

由于数组 a 的大小为 4 个元素,因此有效索引是从 03。因此,通过写入 a[4],您正在越界写入数组,导致 undefined behavior.

如果你写了

for (i = value - 1; i >= 0; i--)

而不是

for (i = value; i > 0; i--)

那么展开的循环将是:

    a[3] = 3;
    a[2] = 2;
    a[1] = 1;
    a[0] = 0;

这样更好,因为现在我们已经修复了未定义的行为;您不再越界写入数组。然而,这仍然不是你想要的。如果你想要降序输出,你展开的循环必须看起来像这样:

    a[0] = 3;
    a[1] = 2;
    a[2] = 1;
    a[3] = 0;

这可以通过将函数更改为以下内容来实现:

int createDescendingArray(int a[])
{
    int i;

    printf( "\nDescending array is created.\n" );

    for ( i = 0; i < value; i++ ) {   
        a[i] = value - i - 1;
    }

    printArray(a); // print of created array
}

这是一个小测试程序:

#include <stdio.h>

//NOTE: It is customary for constants to be written upper-case,
//not lower-case, so the line below should normally not be used.
#define value 4

void printArray (int arr[]) {
   int i;

   printf( "\n" );

   for( i = 0; i < value; i++ )
       printf("%3d ", arr[i]);
}

int createDescendingArray(int a[])
{
    int i;

    printf( "\nDescending array is created.\n" );

    for ( i = 0; i < value; i++ ) {   
        a[i] = value - i - 1;
    }

    printArray(a); // print of created array
}

int main( void )
{
    int array[value];
    createDescendingArray( array );
}

输出为:


Descending array is created.

  3   2   1   0 

在这个测试程序中,我接管了你的大部分其他代码,但我没有接管函数main,因为它也导致了未定义的行为:

int main(){
int arr1[value]; //create new array
arr1[value] = createDescendingArray (arr1); //fill array with descending numbers
}

行中

arr1[value] = createDescendingArray (arr1);

您正在将函数的 return 值赋给一个变量,尽管函数没有 return 值。这会导致未定义的行为。您可能需要考虑在函数声明中将 return 类型更改为 void,如果它没有 return 值。

此外,即使函数 return 一个值,arr1[value] 也会越界写入数组,因为有效索引是从 0value - 1.