簡體   English   中英

指向C中的char和character數組的指針

[英]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 charcharacter arraypointer to char的主要區別是什么?

數組ID或多或少像指針一樣工作。

但是使用指針,您始終需要手動執行3個步驟:

  • 創建指針
  • 分配內存以指向
  • 初始化指針以指向那里

char str[50]; 三個都做,而char *str; 只創建一個未初始化的指針,甚至不創建指向的緩沖區。

指針和數組ID之間的進一步區別:

  • 數組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.

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