簡體   English   中英

C語言數組如何提供隨機數?

[英]How C language array provides a random numbers?

我是 C 語言的新手,在學習數組時發現了以下問題。

#include <stdio.h>
      
int main (void){
      
    int array [10];
    array [5] = 15;
      
    printf("%d\n", array[5]);
    printf("%d\n", array[9]);
    return 0;
}

在這個 main 方法中,當我初始化數組的值時,第一個 printf 方法返回 15。

而且我希望其他未初始化的值,例如 array[9] 返回 0,但是第二個 printf 方法在我的 WSL2 Ubuntu 系統中返回隨機數,例如 32764。

在我正在觀看的教程視頻中,它返回 0。有什么區別,這是如何發生的?

在 C(甚至 C++)中,將術語Initializationassignment分開是很重要的。 初始化僅發生在聲明變量的行。 例子:

int array [10] = { [5] = 15 }; // initialization

理論上,這條線可以在程序加載時在基於 RAM 的系統(如 PC)上計算。 然而,賦值只發生在運行時,只要你設置一個變量的值:

array[5] = 15; // assignment

區別很重要,因為 C 對初始化某些東西時會發生什么有很多規則。 例如,如果您僅初始化數組中的一項,則保證其余項初始化為零。 如果您不初始化任何項目並且數組是本地的(“自動存儲”),那么它將包含垃圾值。

因此,您的示例自printf("%d\n", array[9]);以來具有未指定的輸出。 打印一個不確定的值。 它可以通過將分配更改為初始化來修復,如我所示:

int array [10] = { [5] = 15 };

或者,如果您願意,這是等效的:

int array [10] = { 0,0,0,0,0,15 };

你所做的是去酒店服務台連續預訂10個房間。 現在他們可以為所欲為,但這家酒店沒有清潔人員。 它只關心房間沒有被預訂,所以之前住戶留下的東西都還在。

因此,您將 15 保存到 6 號房間將清理它並將 15 放入那個房間,但其余的仍然是您得到的。

無論如何,這並不是數組所獨有的,您保留的所有內存都是由您處理和管理的。

您尚未初始化array[9] 當您不在 C 中初始化任何變量時,它將包含垃圾值,它可以是任何東西,並且不一定總是0 這就是為什么你不斷得到一些隨機數。

而得到垃圾0的人有他自己的運氣。

你想成為工程師。 C是一種非常低級的語言。 這意味着程序員可以控制內存。

如果您聲明某個變量,在本例中為數組,則該數組分配了“n”字節的內存。 通常,此字節與 0 不同,因為其他程序一直在同一內存空間中執行某些操作。

如果你想初始化數組並且所有這些值你想為0:

int array[10] = {0};

該指令將數組中的所有內存空間歸零。

然后,當您執行時,您將擁有

int array[5] =15;
int array[9]=0;

在這里你有變化:

#include <stdio.h>
int main (void){
//int array [10];
int array[10] = {0}; //init all to 0 values
array [5] = 15;
printf("%d\n", array[5]);
printf("%d\n", array[9]);
return 0;
}

我希望我有所幫助

我希望其他未初始化的值,例如 array[9] 返回 0

未初始化的變量,嗯,沒有初始化。 [1]不歸零,不歸零。 你可以得到任何東西。 它甚至可以殺死你的程序來使用這些數據。

如果要將數組元素初始化為零,請使用

int array[10] = { 0 };

(如果您初始化數組或結構的任何元素,則任何未提供值的元素都將初始化為零。因此,這里有一個0就足夠了。)


  1. 如果沒有提供初始化器,則具有靜態存儲持續時間的變量(全局變量和使用static關鍵字聲明的變量)將隱式初始化為零。

1、Uninitialized,它的值有兩種可能:一種是全局數組,被編譯器初始化為0。 一種是局部數組,它是一個隨機數。 2、已初始化、局部數組和全局數組,已初始化、未賦值的數組將被賦值為0。

未初始化的數組將不等於 0,但可以是任何數字,因此您需要:

int array[10] = {0};

將數組初始化為 0,a[9] 將返回 0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM