![](/img/trans.png)
[英]What is the difference between char str[] and char *str as function parameters?
[英]What is the meaning of the value placed between the braces in char str[]?
要清楚,我不是要問char * str和char str []之間的區別。 我不僅僅是一個初學者。 我正在實現以下代碼:
// Convert long long to string
char number_str[];
sprintf(number_str, "%lld", number_ll);
當我運行printf("%s\\n", number_str);
,無論我在這些括號之間放置2還是256,它都會吐出正確的數字。 這讓我想問一下,這些括號是什么?
我在這篇文章中接觸過char str[]
。
當我運行
printf("%s\\n", number_str);
,無論我在這些括號之間放置2還是256,它都會吐出正確的數字。 這讓我想問一下,這些括號是什么?
這是因為您的代碼調用了未定義的行為 。 您尚未為陣列分配空間。
char
str[]
括號之間的值是什么意思?
這意味着您要為陣列分配多少空間。 但請注意,當使用初始化程序時,可以省略此值,即數組的長度(多維數組的情況下的第一個維度)。
在數組聲明中, [
和]
之間的數字指定數組中的元素數。
您問題中的代碼:
char number_str[];
sprintf(number_str, "%lld", number_ll);
是非法的。 如果它出現在函數定義中,則不能使用空括號; 您必須指定數組的大小 - 並且對sprintf
或任何其他函數的調用只能出現在函數定義中。
如果確實指定了數組的大小:
char number_str[100];
sprintf(number_str, "%lld", number_ll);
創建一個對象number_str
,它是一個包含100個char
元素的數組。 如果你使數組太小:
char number_str[3];
sprintf(number_str, "%lld", number_ll); /* let's say number_ll == 12345 */
那么你的程序似乎可以工作,但實際上它的行為是不確定的 。 sprintf
調用將嘗試在3個字符的數組中存儲6個字符。
AC編譯器沒有義務診斷此錯誤。 它很可能會讓你嘗試這樣做,導致數據被寫入你不擁有的內存區域。
在文件范圍,您可以聲明如下內容:
extern char array[];
它指定一個名為array
的對象,類型為array(某些未指定大小) char
在其他地方定義。
作為一個(相當煩人的)特殊情況,使用數組語法定義的函數參數實際上是一個指針:
void func(char param[42]) {
/* param is a pointer; the 42 is silently ignored */
}
永遠記住數組和指針是兩回事。 有關他們公認的混亂關系的解釋,請參閱comp.lang.c常見問題解答的第6部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.