伊莉討論區

標題: (請教)字串位元組疑惑 [打印本頁]

作者: gordonjohn12    時間: 2018-11-5 04:53 PM     標題: (請教)字串位元組疑惑

[attach]125474955[/attach]

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


作者: 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

提示: 作者被禁止或刪除 內容自動屏蔽
作者: mountainboy    時間: 2018-11-18 12:17 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: mountainboy    時間: 2018-11-18 08:17 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: snowflying    時間: 2018-11-18 10:11 PM

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

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

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

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


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


巨集也不完全是函數
  1. #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 卻不是

作者: mountainboy    時間: 2018-11-20 07:53 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: 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
如果要相同的話,是要再輸入的地方加入*嗎?  這樣才能抓取到他的指標位置

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

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

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

建議是用第二種方式,
因為如果以後遇到動態陣列或二維陣列時會比較適應。
作者: 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));




歡迎光臨 伊莉討論區 (http://eyny.com/) Powered by Discuz!