簡體   English   中英

C-局部函數變量更改范圍(全局)變量的值錯誤行為

[英]C - Local function variable chages value of Scope (global) variable Error behavior

我有一個全局變量,稱為: char clientes_dni[] 我正在從主要位置調用一個函數,例如: comprobarExistenciaDNI(clientes_dni) 我的函數comprobarExistenciaDNI是:

bool comprobarExistenciaDNI(char DNI[]) {
    /// Change to lower DNI last word
    DNI[8] = tolower(DNI[8]);
    return (true);
}

如果我的var的值為'11111111J',則函數后的值為'11111111j'。 我不使用全局變量,而只使用局部變量,所以...為什么更改了clientes_dni值?

謝謝。

我認為問題在於DNI是一個數組(一個指針),所以當您說時實際上是在修改數組的內容

DNI[8] = tolower(DNI[8]);

就像您通過引用函數發送變量一樣。

您有使用指針的經驗嗎?

編輯1:

我給你一個快速的破壞者。 指針是存儲器地址的值。 就像我說的那樣,數組是一個指針,該數組“指向”內存中數組的第一個元素(這些元素彼此相鄰),因此當您發送clientes_dni時,您將第一個元素的位置發送至comprobarExistenciaDNI函數。 然后,該函數修改該存儲器地址的值(內容)。 這就是為什么它在主作用域中被修改的原因,因為您修改了內存地址的內容。

發送任何其他數據類型的變量時,發送的是變量的副本,而不是變量本身,這是不同的。

數組通過第一個元素的地址傳遞。 在大多數使用情況下(幾乎沒有類似sizeof運算符的例外),數組的名稱(假設A )與&A[0]同義。 如果您要執行此操作, structs值傳遞structs (將數組包裝在struct )。

您的局部變量是指針類型,它指向一個全局字符串。 函數的“數組”參數未分配和深度復制,而是綁定到地址。

暫無
暫無

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

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