我必須為列印陣列創建函式,用降序填充陣列。
我創建了用于列印陣列和創建降序陣列的函式。但是我遇到了一個問題。如果我使用我自己的函式printArray()它會列印一些不清楚的東西。問題出在哪里,我做錯了什么?請幫忙。
這是 C 中的代碼。 value - 是陣列的值
列印陣列的函式:
void printArray (int arr[]){
int i;
printf("\n");
for(i = 0; i < value; i )
printf("= ", 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 funktion 中使用標準方法列印它時,如下所示:
{int i;
for(i = 0; i < value; i )
{
a[i]=i;
printf("=", a[i]);
}
}
它將降序陣列顯示為升序(看圖片)它是如何作業的?

uj5u.com熱心網友回復:
您一直在列印陣列的函式中使用名為 value 的變數,而沒有對其進行初始化,因此是垃圾值。
您應該在函式中初始化它或將其起始值作為引數傳遞給函式。
#include <stdio.h>
#include <stdlib.h>
void printArray(int *arr, int length)
{
int i;
printf("\n");
for (i = 0; i < length; i )
{
printf("= ", 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 上的演員表
uj5u.com熱心網友回復:
功能
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個元素,有效索引是從0到3。因此,通過寫入a[4],您正在越界寫入陣列,從而導致未定義的行為。
如果你寫過
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;
This can be accomplished by changing your function to the following:
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
}
Here is a small test program:
#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("= ", 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 );
}
The output is:
Descending array is created.
3 2 1 0
In this test program, I took over most of your other code, but I did not take over the function main, because it was also causing undefined behavior:
int main(){
int arr1[value]; //create new array
arr1[value] = createDescendingArray (arr1); //fill array with descending numbers
}
In the line
arr1[value] = createDescendingArray (arr1);
you are assigning the return value of the function to a variable, although the function did not return a value. This causes undefined behavior. You may want to consider changing the return type to void in the function declaration, if it does not return a value.
Also, even if the function did return a value, arr1[value] would be writing to the array out of bounds, as valid indices are from 0 to value - 1.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338887.html
