簡體   English   中英

為什么編譯器沒有在參數中傳遞數組char * arr []的大小?

[英]Why compiler doesn't pass size of array char *arr[] in parameters?

為什么編譯器沒有在參數中傳遞數組char * arr []的大小? 我想獲得通過參數傳遞的數組的大小,但我想它不起作用,因為即使char *a[]char **我的問題是為什么它,我能使它工作嗎?

#include <stdio.h>
#include <stddef.h>
#include <stdio.h>

template<class T, size_t len>
constexpr size_t lengthof(T(&)[len])
{
    return len;
}
void printarr(const char *a[]);

int main()
{
    const char *a[] = { "aba", "bd", "cd" };
    printarr(a);
}

void printarr(const char *a[])
{
    for(size_t i = 0, c = lengthof(a); i < c; i++) {
        printf("str = %s\n", a[i]);
    }
}

您可以使用在lengthof函數模板中使用的相同技巧使其工作。

template<size_t len>
void printarr(const char* (&a)[len])
{
    for(size_t i = 0, c = lengthof(a); i < c; i++) {
        printf("str = %s\n", a[i]);
    }
}

這從一開始就是C的一個特性,並貫穿到C ++中。

對於字符串數組,解決方案是添加尾隨空字符以標記結尾。

當C在古老的PDP計算機上開始時,可​​能是為了效率而做的。

使用strlen; 或者更好的是std :: string或std :: vector。

因為這是C ++標准所要求的,它從C繼承了這種行為(因為C ++希望與C保持兼容)。

作為函數參數,數組被衰減為指針。

你真的想要使用類似std::vector<std::string> 了解有關標准C ++ STL容器的更多信息。

C ++是一種提供對系統資源的低級訪問的語言。 處理器不使用對象,但使用內存地址。

如果您想要預定義的結構,請使用Java,C#,python或c ++庫,例如stl。

從語言的角度來看,你的數組沒有長度; 編譯器無法讀取您的想法並決定數組的開始位置和結束位置,並且不會浪費內存和處理來執行范圍檢查。
與數組長度最接近的是由單個new[]調用分配的連續內存空間的數量,但是這些信息僅用於分配和釋放內存的權威:要在其中處理的“數組”您的函數可能只是單個分配的一部分(例如,您可能會分配內存來加載整個文本文件並分別處理每一行)。

暫無
暫無

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

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