[英]Pointer to char and character array in C
我一直想知道這兩個在C語言之間有什么區別
char *str;
char str[50];
我有以下代碼用於從用戶輸入中讀取字符串,而不是使用gets。
int read_line(char *str, int n);
int main (int *argc, char *argv[])
{
char *str;
read_line(str, 50);
printf("%s", str);
return 0;
}
int read_line(char *str, int n)
{
int ch, i = 0;
while((ch = getchar()) != '\n')
{
if(i < n)
{
*str++ = ch;
i++;
}
}
*str = '\0';
return i;
}
編譯工作正常,但在嘗試運行時崩潰了。 然后將參數更改為read_line()
函數,而不是char *str
我使用char str[50]
。
使用char *str[50]
作為參數時,程序將按預期運行。
有人可以解釋為什么會這樣嗎? 或pointer to char
和character array
的pointer to char
的主要區別是什么?
數組ID或多或少像指針一樣工作。
但是使用指針,您始終需要手動執行3個步驟:
char str[50];
三個都做,而char *str;
只創建一個未初始化的指針,甚至不創建指向的緩沖區。
指針和數組ID之間的進一步區別:
sizeof array
返回數組大小,而sizeof ptr
返回存儲地址所需的內存大小。 主要區別在於,后者為50個字符分配內存(str是第一個元素的指針),而前者僅聲明一個指針(除了指針變量本身的內存之外,沒有分配內存)。
如果您運行此簡單程序,將立即看到區別
#include <stdio.h>
int main( void )
{
char *str1;
char str2[50];
printf( "%zu\n", sizeof( str1 ) );
printf( "%zu\n", sizeof( str2 ) );
}
程序輸出可能看起來像
4
50
如您所見,數組str2
有足夠的內存來存儲最多50個字符的字符串,而指針只能存儲某些內存的地址。
當您像代碼中那樣將數組傳遞給函數時
read_line(str2, 50);
(其中str2聲明為char str2[50];
),然后將數組名稱隱式轉換為指向其第一個元素的指針。 因此,例如,這些函數聲明是等效的
int read_line(char *str, int n);
int read_line(char str[50], int n);
甚至喜歡
int read_line(char str[100], int n);
int read_line(char str[], int n);
並聲明相同的一個函數,因為像數組這樣聲明的參數已調整為指針。
因此,當您傳遞數組時,該函數將獲得指向已定義內存的數組的第一個元素的指針,因為已定義了數組。
當您像在此主函數中一樣傳遞指針時
int main (int *argc, char *argv[])
{
char *str;
read_line(str, 50);
printf("%s", str);
return 0;
}
則它沒有被初始化並且具有一些不確定的值。 結果,程序行為是不確定的。 指針應指向一些分配的存儲器,可以在其中存儲輸入數據。
例如,您可以通過以下方式執行此操作
int main (int *argc, char *argv[])
{
char *str1;
char str2[50];
str1 = str2;
read_line(str1, 50);
printf("%s", str1);
return 0;
}
要么
int main (int *argc, char *argv[])
{
char *str = malloc( 50 * sizeof( char ) );
read_line(str, 50);
printf("%s", str);
free( str );
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.