[英]Passing a pointer (string) to a C function
請說到最后,再說:“哦,不,這個問題再次出現……”
我現在正在參加C課程,並且在課程本中提供了以下示例:
#include <stdio.h>
#include <stdint.h>
void Terminal_PrintData(uint16_t * const Data);
int main(void){
uint16_t StringData[] = "MyData";
Terminal_PrintData(StringData);
}
void Terminal_PrintData(uint16_t * const Data)
{
printf("Value: %s", *Data);
}
當我編譯這個傑作時,我得到的是:
F:\AVR Microcontroller>gcc -o test test.c
test.c: In function 'main':
test.c:7:26: error: wide character array initialized from non-wide string
uint16_t StringData[] = "MyData";
我的問題是:
uint16_t
聲明字符串是否正確? 您的直接問題:
- 用uint16_t聲明字符串是否正確?
沒有。
所有字符串始終為char[]
。 還存在寬字符串 ( 寬字符的字符串),其類型為wchar_t[]
,並以L
前綴編寫(例如L"hello"
)。
- 建議將字符串傳遞給函數的方法是什么?
char *
或wchar_t *
都是指向字符串中第一個字符的指針。 const
限定詞在這里沒有意義; 這意味着指針(而不是字符串本身)是常量(請參見此處 )。 我建議寫wchar_t const *
或const wchar_t *
代替; 它具有不同的含義(即字符串不能更改),但是它是正確且有意義的。
您提到此代碼來自一本教科書。 我不確定您是說這些是您的教授分發的講義,還是購買了已出版的書。 無論哪種情況,如果該摘錄都代表了書/筆記的質量,請退款 。
現在,讓我們使這段代碼起作用。
這段代碼中有一個錯誤,它將導致程序崩潰:
string
為char*
時printf("... %s ...", ..., *string, ...)
總是錯誤的。 不要取消引用該指針。 如果您堅持使用“寬”字符(這是可疑的 ),那么您將不得不進行一些更改:
char
,您需要包括<wchar.h>
並使用wchar_t
代替。 據我所知,除非您到處都使用顯式強制轉換,否則uint16_t
和uint8_t
將無法工作。 這是因為char
沒有8位,而是CHAR_BIT
bits 。 L
前綴開頭。 printf
,還需要使用wprintf
。 %ls
而不是%s
。 ( 除非您使用Microsoft的編譯器 。) 最后,一些不太嚴重的錯誤:
T * const
參數是無用的。 作者可能指的是T const *
(或等效的const T *
)。 <stdint.h>
和<stdio.h>
。 我們不再使用uint16_t
,並且<wchar.h>
聲明了一些<wchar.h>
<stdio.h>
寬字符函數。 我最終得到以下代碼:
#include <wchar.h>
void Terminal_PrintData(wchar_t const * Data);
int main(void){
wchar_t StringData[] = L"MyData";
Terminal_PrintData(StringData);
}
void Terminal_PrintData(wchar_t const * Data)
{
wprintf(L"Value: %ls", Data);
}
它可以在Linux x86-64上與GCC和Clang一起編譯並按預期運行。
有兩種字符串:由char
組成的“非寬”字符串和由wchar_t
組成並寫為L""
“寬”字符串(單個wchar_t
可以寫為L''
)。 有一些函數可以在它們之間進行轉換。 除了這些,您不能將它們混合在一起。
根據系統的不同, wchar_t
可以為16或32位寬。
您應該將字符串視為一個字符數組(在本例中為8位字符),這樣uint8_t就足夠了。 通常,您要做的是將字符串的開頭(即數組的指針)傳遞給函數。 為了更加安全,您還可以將字符串的長度作為參數傳遞,但是通常您的字符串將以定界符(\\ 0)結尾。
當您將stringData
傳遞給函數時,實際上是在說&stringData[0]
,字面意思是“數組的第一個元素([0])的地址(&)”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.