簡體   English   中英

在C中定義字符串的正確方法是什么?

[英]what is the correct way to define a string in C?

在C中定義字符串的正確方法是什么? 使用:

char string[10];

要么

char *string="???";

如果使用數組,則可以使用任何指針指向它,然后對其進行操作。 似乎使用第二個會引起麻煩,因為我們沒有為此分配內存。 我被告知數組只是一個指針值,我以為這兩個以前是相同的。 直到我做了類似string* = *XXXX ,並意識到它不能像指針一樣工作。

正如@affenlehrer所指出的,如何“定義”字符串取決於您要如何使用它。 實際上,在C中“定義”字符串實際上只不過是將其放在程序中的引號中。 您可能應該閱讀更多有關內存如何工作以及如何在C中分配內存的信息,但是如果您這樣寫:

char *ptr = "???"

發生的情況是編譯器將使用字符串“ ???” (實際上是四個字節的數據,三個“?”后跟一個零字節,用於NUL終止符)。 它將在程序的某個靜態位置(在.bss段中 )插入該字符 ,並且在程序開始運行時,將初始化ptr的值以指向內存中的該位置。 這意味着您有一個指向四個字節的內存的指針,並且如果嘗試在這些字節之外進行寫入,則您的程序正在做某些不好的事情(可能違反了內存安全性)。

另一方面,如果你寫

char string[10];

然后,這基本上告訴編譯器在程序中分配10個字節的空間,並使變量“ string”指向它。 這取決於將其放置在哪里:如果將其放置在函數中,則將為堆棧分配10字節的緩沖區。 如果您函數內部操作此緩沖區,然后再對指針不執行任何操作,則一切都很好。 但是,如果在函數返回后傳遞回字符串的地址-或以任何方式使用指針-您就錯了。 這是因為在函數返回后,您將丟失所有堆棧分配的變量。

還有更多的方法可以在C中創建字符串(例如,使用malloc)。 你的用例是什么? 基本上,您需要在內存中存儲數據的位置(在第二個示例中是在堆棧上,在堆上,是靜態的),然后是指向字符串第一個字符的字符指針。 大多數與字符串相關的函數將在字符串的末尾加上“ \\ 0”,在某些其他情況下(通常是與通用數據相關的函數),您還必須提供字符串的長度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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