簡體   English   中英

將指針(字符串)傳遞給C函數

[英]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 *代替; 它具有不同的含義(即字符串不能更改),但是它是正確且有意義的。


您提到此代碼來自一本教科書。 我不確定您是說這些是您的教授分發的講義,還是購買了已出版的書。 無論哪種情況,如果該摘錄都代表了書/筆記的質量,請退款

現在,讓我們使這段代碼起作用。

這段代碼中有一個錯誤,它將導致程序崩潰:

  • stringchar*printf("... %s ...", ..., *string, ...)總是錯誤的。 不要取消引用該指針。

如果您堅持使用“寬”字符(這是可疑的 ),那么您將不得不進行一些更改:

  • 而不是使用char ,您需要包括<wchar.h>並使用wchar_t代替。 據我所知,除非您到處都使用顯式強制轉換,否則uint16_tuint8_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM