簡體   English   中英

即使在數組中添加更多具有值的元素后,數組的大小也保持不變

[英]Size of array stays the same even after adding more elements with values to the array

這只是我今天在玩一些代碼時學到的東西。 我還是C新手,請客氣。

下面的代碼基本上是使用只有一個元素的數組並檢查其大小和值(分別為4和0)。 然后,它在數組中創建新元素,並在再次檢查數組大小之前為這些新元素分配值。

我發現的是數組的大小沒有增加。 如果我從頭開始創建5個元素的數組,則數組大小為20。如果我從頭開始僅創建1個元素並在以后添加其他4個元素,則數組大小保持為4,但仍包含5個帶有值的元素。

有人可以解釋為什么會這樣嗎? 這是在節省空間的同時將值分配給數組的安全方法嗎? 或者這有什么問題嗎?

我想念什么嗎?

如果我在錯誤的Stack Exchange論壇上發布了此內容,請告訴我,以便將其刪除並在其他地方提問,謝謝。

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

int main()
{
    int n = 5; 
    char temps[257] = "1 -2 -8 4 5\n"; 
    int arr[1] = {0};
    int c;   

printf("\n-- START of Test area --\n\n");

// sizeof arr = 4
printf("Initial sizeof(arr) = %d\n\n", sizeof(arr));

// Initial values of arr
printf("Value of arr[0] = %d\n", arr[0]);    // 0
printf("Value of arr[1] (no value assigned) = %d\n", arr[1]);    // random number
printf("Value of arr[2] (no value assigned) = %d\n\n", arr[2]);    // Random number

// sizeof arr = 4
printf("sizeof(arr) = %d\n\n", sizeof(arr));

// -- Creates new array elements and assigns values using temps 
sscanf(temps, "%d\n %d\n %d\n %d\n %d\n", &arr[0], &arr[1], &arr[2], &arr[3], &arr[4]);    

printf("New array elements and values using temps\n\n");
printf("Value of arr[0] = %d\n", arr[0]);  // 1
printf("Value of arr[1] = %d\n", arr[1]);  // -2
printf("Value of arr[2] = %d\n", arr[2]);  // -8
printf("Value of arr[3] = %d\n", arr[3]);  // 4
printf("Value of arr[4] = %d\n", arr[4]);  // 5
printf("Value of arr[5] = %d\n\n", arr[5]);  // 0

// Sizeof array = 4
printf("sizeof(arr) = %d\n\n", sizeof(arr)); 

printf("\n-- END of Test area --\n\n");

    return 0;
}

聲明數組后,您將無法對其添加或減去任何元素,但可以進行修改。
還有一件事是arr的大小為1並且您正在訪問某些語句中的數組,例如

sscanf(temps, "%d\n %d\n %d\n %d\n %d\n", &arr[0], &arr[1], &arr[2], &arr[3], &arr[4]); 

它調用未定義的行為。

根據定義,數組是一塊連續的內存。 這意味着您只能一次告訴編譯器有關數組大小的信息,它將為數組分配內存。

例如,如果您編寫int n[10]; 編譯器將在堆棧上為10個整數值保留內存(例如,每個int為8個字節)。

在這種情況下, n[9]是數組保留的最后一個元素,因為n[0]是第一個元素。

讓我更詳細地解釋一下: n實際上是數組第一個元素的內存地址。 實際上, n[0]n具有相同的存儲器地址。 如果你有int i; 表示您要訪問的數組的索引:

n[i]告訴編譯器查看內存位置n + (i * sizeof(int));

編譯器知道數組的類型,因此知道使用n[i];時如何計算適當的地址n[i];

現在,如果i無效,編譯器將提供一個可能包含垃圾的內存地址,或者您可能無權訪問。 如果您不小心,將會給您帶來麻煩。

由於C某種程度上是一種較低級的語言,所以它不支持數組范圍檢查,也無法為您跟蹤數組大小。 這意味着您應該自己跟蹤它! 否則您將面臨不確定的行為風險。

還有其他數據結構可以根據需要增長和收縮(例如鏈表),但通常使用“免費存儲”或“堆內存”的數據結構,其工作方式不同於在堆棧上分配的內置數組。

聲明數組時,無法訪問設置的維度> =的元素。 設置的參數應為常量,並且在編譯時已知

例如

int n;
int arr[n]; // error: this is not known in compilation-time

int arr[2];
arr[5] = 6; // error: arr[5] doesn't actually exists!

暫無
暫無

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

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