這個問題在這里已經有了答案: 如何找到“sizeof”(指向陣列的指標)? (16 個答案) 2天前關閉。
自2 天前起,社區正在審查是否重新提出此問題。
如何使用指標作為引數通過函式獲取變數的大小?
readEachChar(unsigned char * input){
printf("The the size of the string %zu", sizeof(input));
for (size_t i = 0; i < sizeof(input); i ) // currently it show me the size of the pointer (8 bytes)
{
printf("[%x]",input[i]);
}
printf("\n");
}
unsigned char text[] = "thisisalongkindofstring";
int main(){
readEachChar(&text);
return 0;
}
uj5u.com熱心網友回復:
在行
printf("The the size of the string %zu", sizeof(input));
sizeof操作員會給你指標的大小input。它不會給你它指向的物件的大小(可能是陣列的大小或字串的長度)。
在函式main中,定義
unsigned char text[] = "thisisalongkindofstring";
將創建text一個包含 24 個字符的陣列:這 24 個字符由 23 個實際字符和一個用于空終止字符的額外字符組成。在C 中,根據定義,字串是一個以空字符結尾的字符序列,即帶有字符代碼的字符0。
因此,為了確定字串的長度,必須計算字串的每個字符,直到遇到終止空字符。您可以自己執行此操作,也可以使用strlenC 標準庫提供的函式。
此外,通常將資料型別char用于字串的單個字符,而不是unsigned char. C 標準庫的所有字串處理函式都需要 type 的引數char *,not unsigned char *,因此,根據您的編譯器,混合這些資料型別可能會給您警告甚至錯誤。
另一個問題是這條線是錯誤的:
readEachChar(&text);
該函式readEachChar似乎期望函式引數是指向字串第一個字符的指標,而不是指向整個陣列的指標。因此,您應該寫&text[0]而不是&text. 你也可以簡單地寫text,因為這個運算式會自動衰減到&text[0].
應用上述所有修復后,您的代碼應如下所示:
#include <stdio.h>
#include <string.h>
void readEachChar( char * input )
{
size_t len = strlen( input );
printf( "The size of the string: %zu\n", len );
for ( size_t i = 0; i < len; i )
{
printf( "[%x]", input[i] );
}
printf("\n");
}
int main()
{
char text[] = "thisisalongkindofstring";
readEachChar( text );
return 0;
}
該程式具有以下輸出:
The size of the string: 23
[74][68][69][73][69][73][61][6c][6f][6e][67][6b][69][6e][64][6f][66][73][74][72][69][6e][67]
uj5u.com熱心網友回復:
對于初學者,此呼叫中的引數運算式
readEachChar(&text);
有型別unsigned char ( * )[24]。但是函式引數的型別unsigned char * 不是兼容的型別。
所以編譯器應該發出一條訊息。
如果你會寫
readEachChar(text);
那么函式內,你應該只呼叫函式strlen一樣
for (size_t i = 0, n = strlen( input ); i < n; i )
{
printf("[%x]",input[i]);
}
否則,如果傳遞的陣列不包含字串,則必須使用第二個引數宣告函式,該引數將分配傳遞陣列中元素的數量。
uj5u.com熱心網友回復:
你不能只要求 sizeof(pointer) 因為你會得到指標本身的大小。取而代之的是-您可以更改函式以獲取大小作為引數:
readEachChar(unsigned char * input, unsigned size)
并從 main 發送大小:readEachChar(&text, sizeof(text));
另一種解決方案是遍歷 char 直到最后到達 NULL 并計算其中的字符 - 這就是strlen函式的作用。
uj5u.com熱心網友回復:
如何使用指標作為引數通過函式獲取變數的大小?
printf("The the size of the string %zu", sizeof(input)); 確實列印了變數的大小input,它是一個指標。明顯的 OP 想要其他東西的大小,例如text[].
要獲取物件的大小,請將該大小傳遞給函式。
void foo_sz(size_t sz) {
printf("Size: %zu\n", sz);
}
// Call
foo_sz(sizeof text);
要獲取物件的大小和物件的地址,請同時傳遞兩者。
void foo_both(size_t sz, void *ptr) {
printf("Size: %zu\n", sz);
printf("Ptr: %p\n", ptr);
}
// Call
foo_both(sizeof text, text);
要通過使用指標作為引數的函式獲取變數的大小,每個型別的原型
// 123456789012345678901234
// "thisisalongkindofstring"
void foo_1(unsigned char (*ptr)[24]) {
printf("Size: %zu\n", sizeof *ptr);
printf("Ptr: %p\n", (void *) ptr);
}
// Call
foo_1(&text);
當然,現在代碼失去了一個通用的方面,但確實滿足了“通過使用指標的函式來調整變數的大小”的目標。
或者考慮使用宏來呼叫 1 個引數,但同時傳遞大小和地址。
#define FOO_M(obj) foo_both(sizeof(obj), &(obj))
// Call
FOO_M(text);
如果obj是 VLA 或運算式,則存在其他問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/415835.html
標籤:
上一篇:為什么我沒有得到程式的輸出。每當我運行我的代碼時,它會在輸入后停止?[復制]
下一篇:C鏈表不兼容的指標型別
