簡體   English   中英

C char數組指針混亂

[英]C char array pointer confusion

我寫了以下 c 代碼:

#include <stdio.h>
#include <stdlib.h>

void func1(char *arr){
    printf("%d\n",arr[0]);
    printf("%d\n",arr[1]);
    return;
}

int main () {
    char a[6] = "hello";
    printf("%p\n",a);
    printf("%p\n",&a);
    func1(a);
    return 0;
}

當我執行此代碼時,我正在關注 output

0x7fff5a7323e2
0x7fff5a7323e2
104
101

以下是我的疑惑:

  1. 為什么arr[1]的值小於arr[0] ,這些值是什么?
  2. 假設給定 0 到 1073741823 是有效的 memory 范圍,我們必須檢查傳遞給 func1 的數組是否在有效范圍內,然后如何檢查。

1. 為什么arr[1]的值小於arr[0] ,這些值是什么?

printf("%d\n",arr[0])printf("%d\n",arr[1])將打印這些位置字符的十進制值,因為您的字符編碼是 ASCII十進制值e ( arr[1] ) 的值為 101,十進制值h ( arr[0] ) 為 104,您可以在鏈接表中查看。


2. 假設給定 0 到 1073741823 是有效的 memory 范圍,我們必須檢查傳遞給 func1 的數組是否在有效范圍內,然后如何檢查。

在這種情況下,因為它是一個字符串,你知道它在數組末尾會有一個標記 null 字節,所以你可以使用:

// initially arr will be pointing to the first element of the array
while(*arr != '\0'){ // will evaluate to false when the string ends
     
    //do stuff...
    arr++;

}

還有其他方法可以做到這一點,例如,將數組的大小作為第二個參數傳遞:

void func1(char *arr, int size){...}

和電話:

func1(a, sizeof a / sizeof *a);

當您的數組不是null 終止數組時,這更有用,否則您始終可以使用哨兵來指示 arrays 的結尾,缺點是在大多數情況下您需要自己添加它們。


請注意, printf("%p\n", a)的行為未定義,您應該有printf("%p\n", (void*)a)

您需要了解printf的格式化字符串。 printf("%d\n",arr[0]); 期望打印一個integer到output。但是在C中,字符可以根據其在memory中的編碼值處理為integer。例如,104根據ASCII編碼表示“h”。 而101代表“e”。 為您的陣列分配的 memory 由系統管理,您不應該檢查它們是否在有效范圍內。 但您始終可以將它們視為 integer 並使用簡單的比較運算符。

對於第二部分,您可以將十六進制地址轉換為十進制,並將其與提供的范圍進行比較。

暫無
暫無

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

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