2017-03-24 170 views
-2

C語言中的以下代碼是否正確?我不是100%肯定的函數參數 「a」 的範圍:函數參數範圍C

void method(int a) 
{ 
    MyStruct mystruct; 
    mystruct.value = (void*) (&a); 

    nested_method_call(mystruct); 
} 
+0

我覺得這個代碼是正確的,因爲會被釋放,只有當執行左方法。如果nested_method_call不會在全局變量的某處存儲參數。 – Anton

+4

'struct'是一個關鍵字,不能用作變量名。 –

+1

發佈您的'struct MyStruct'聲明 – sameerkn

回答

0

更正代碼:struct.value = (void*)&a;。還有一些其他驗證需要完成。

所以,如果你完全糾正你的代碼,使其符合正確的話,正確的詞將是Lifetime,而不是Scopea的使用期限將一直持續到功能method的結束。因此,a仍然可以在nested_method_call內部通過指針struct.value進行訪問,假定struct.value的類型爲int*

+3

是否真的需要轉換? –

+0

@SouravGhosh:取決於'struct.value'的類型。如果'struct.value'是int,那麼就不存在'a'的生命週期或範圍問題。 – sameerkn

+0

@sameerkn如果'struct.value'是'int',那麼1)轉換爲'void *'將不會有用,2)關於生命週期或範圍沒有什麼不同,因爲我們認爲'int'會被轉換回到一個指針。 – Potatoswatter

1

首先,struct是C中的一個關鍵字,不能用作變量名,所以這是錯的的代碼。

之後,將整型轉換爲指針(反之亦然)是實現定義的行爲。如果你必須完成轉換,你應該更好地使用uintptr_t


這就是說,從你的問題的基本前提,代碼背後的邏輯似乎是合法的,有一個與範圍沒有問題。如果你的意思,以詢問該壽命[「的對象的生存期是在其期間存儲 保證是爲它保留的程序執行的部分」],然後,它是直到method()函數的末尾和你在這個限制內使用它,所以你很好走。

+0

注意:OP現在在最後一次編輯中使用'a'的地址。 – Quentin

1

讓我們假設它是:

void method(int a) 
{ 
    MyStruct x; 
    struct.value = (void*) a; 

    nested_method_call(x); 
} 

因爲struct不能用來作爲變量名。 a的範圍的功能,所以它是活的過程中nested_method_call,但是,那絕對是不相關的,因爲你的nested_method_call是不是指它 - 它使用副本a重新解釋爲void*。 (這樣的再闡釋使得代碼相當不可移植和不尋常的,順便說這可能是一個錯誤。)

編輯:

void method(int a) 
{ 
     MyStruct mystruct; 
     struct.value = (void*) &a; 

     nested_method_call(mystruct); 
} 

是有效的(儘管它通常是由通過結構是個好主意因爲它對於任何非常小的結構都更快)。 &a是一個有效的參考,直到}method

你也不應該需要那個演員。如果.valuevoid*,則不需要它。如果不是這樣,演員可以將&a轉換爲任何其他數據指針,這可能是類型系統中的一個危險漏洞。