查看完整版本: (請教)字串位元組疑惑
頁: [1]

gordonjohn12 發表於 2018-11-5 04:53 PM

(請教)字串位元組疑惑



想請問一下,同樣的字串內容,為何在MAIN程式裡外所SIZEOF出來的值會不一樣呢?

<div></div>

cockroachrun 發表於 2018-11-5 05:22 PM

在C/C++ 中. 傳送陣列到副程式 實際上只是把陣列的開始address 傳過去. 變成一個指標型別. 當然就不會跟本來的array 大小一樣

另指標占用的大小因不同系統大小一定. 一般在32bit windows 下為4byte. 64bit 為8byte

z1090128 發表於 2018-11-17 07:29 PM

如果要相同的話,是要再輸入的地方加入*嗎?  這樣才能抓取到他的指標位置

mountainboy 發表於 2018-11-17 09:38 PM

sizeof 是靜態函數,也就是編譯時已定!你的例子中sizeof(str2),因str2 是靜態宣告,所以sizeof 算真實字元+1個0結束字串字元。在length()中的sizeof(str),因為是動態參數傳送(此例為call by reference),所以sizeof(str)只算資料型態的空間。如前面人所提,指標的空間為4 bytes (32-bit system) 或 8 bytes (64-bit system。

如果要得到相同答案,可以兩個字串宣告移到最上方,變成全域變數。

mountainboy 發表於 2018-11-18 12:17 AM

mountainboy 發表於 2018-11-17 09:38 PM static/image/common/back.gif
sizeof 是靜態函數,也就是編譯時已定!你的例子中sizeof(str2),因str2 是靜態宣告,所以sizeof 算真實字 ...

運算子也是函數的一種!例如加法(+),也可以寫成(+, 1 2),結果是3. 數學上,函數是定義域到值域的轉換。從這個角度,sizeof 當然是函數,它接收一個值,對映到另一個值!...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

mountainboy 發表於 2018-11-18 08:17 PM

逗點在一般程式語言中只是個分隔符號(token),不是運算子喔!關於”但在程式語言來說,函數是需要括號的,而運算子不用”,我先前的例子來自Scheme 語言,所有運算子都是以函數括號呈現!所不同的是sizeof()是靜態函數,在編譯時就知道結果了,類似巨集。但巨集也是函數。所以通常都叫巨集函數!

snowflying 發表於 2018-11-18 10:11 PM

mountainboy 發表於 2018-11-18 08:17 PM static/image/common/back.gif
逗點在一般程式語言中只是個分隔符號(token),不是運算子喔!關於”但在程式語言來說,函數是需要括號的, ...

這邊是 C/C++ 版區,自然是談這個了

逗號是運算子
https://en.cppreference.com/w/cpp/language/operator_precedence
去查 spec 也是說 comma operator

編譯時知道結果,不代表是函式,這是兩件不同的事情
況且一般來說,函式是在執行時期執行一至數個動作,不是在編譯時期
因此常常涉及一些 calling convention 的問題,但純粹的運算子不會


函式回傳值也不是必要的
所以以有無定義域、值域來說,是不準確的
例如:
setbuf(stdout , NULL );
setbuf 沒有回傳值,卻是 C/C++ 裡面的函式


巨集也不完全是函數
#define TAG "EOF"
這一樣是巨集,但與函數無關
所以 gcc 的網站分成了 Object-like Macros 、Function-like Macros
https://gcc.gnu.org/onlinedocs/cpp/Macros.html

其他不同語言也不該混進來談
光 print 在 python 2 和 python 3 就是不同的東西
在 python 3 裡是個函式,而在 python 2 卻不是
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

mountainboy 發表於 2018-11-20 07:53 AM

你應該去查ISO的C++17 標準,cppreference.com 當參考就好!
C++ 的逗號有特殊用途,而它也會傳回一個值。setbuf()不是不傳回值,而是傳回的值是void型。
你的例子#define TAG "EOF",其實定義域是TAG, 值域是"EOF" 也是函數。
我不用函式,那個不是function 的真意!

advantise 發表於 2018-11-28 01:14 AM

cockroachrun是對的, sizeof是在compiler time就決定了,你想得到一樣的值你也可以把string移到length()裡

ykshieh 發表於 2018-11-28 07:37 PM

z1090128 發表於 2018-11-17 07:29 PM static/image/common/back.gif
如果要相同的話,是要再輸入的地方加入*嗎?  這樣才能抓取到他的指標位置

如同cockroachrun與mountainboy提到的
在主程式中用sizeof()得到str2的大小,可以得到正確的大小。

但是在副程式length()中的情況,
副程式傳進來的,是一個變數名叫str的指標,
利用sizeof()將"指標的大小"顯示出來,
就是一個指標的大小。

至於這樣用sizeof()的方式想要得到主程式與副程式相同的答案是不可能的,
用別的方式的話,有很多種解法。
1.不用sizeof(),而是strlen()。
2.從主程式傳陣列大小到副程式。
3.如同mountainboy提到,宣告成全域變數。
...等等的變通方法。

建議是用第二種方式,
因為如果以後遇到動態陣列或二維陣列時會比較適應。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

z1090128 發表於 2018-12-1 07:46 PM

也就是說你第一個回傳的是矩陣的大小,但第二個的是那個矩陣位置的大小,因為你是用char,所以在C中char的大小為1 byte,所以才會只有八個位元?

hunter00101 發表於 2018-12-10 04:49 PM

void length(char *str,char strbyte)
{
    ...........
}
呼叫時
length(str,sizeof(str));
頁: [1]