假設一個陣列 char *words[] = {"The", "Quick", "Brown", "Fox", "Jumped", "Over", "The", "Lazy", "Dog"};和一個char ** point = &word[9];不知道輸入陣列大小的指標,你怎么能把指標帶到陣列的開頭?這樣做的目的是在遞回函式中使用,其中指標設定在陣列的開頭,但隨著函式的遞回,每次遞回時指標都會遞增。
我試過簡單地遞減指標,直到我在開始時遇到一個空指標,但指標指向記憶體中超出陣列的某個隨機值。關于如何解決這個問題的任何建議?
uj5u.com熱心網友回復:
一般來說,僅給定一個指向其元素之一的指標,就無法知道陣列的大小;你必須自己跟蹤它。
要么保留一個指向陣列開頭的指標,要么自己在那里放置一些標記值(如空指標)。
uj5u.com熱心網友回復:
你不能。指標只不過是記憶體中的地址。一個簡單的數字。陣列的開始在記憶體中的不同地址,另一個簡單的數字。
例如,您的陣列可能從記憶體地址 12608(= 除 0 以外的任何可能的數字)開始,并且它的最后一個元素將在地址 12680 處。您不知道地址 12600 或 12688 處存盤了什么。如果您訪問這些地址中的任何一個,任何事情都可能發生,從靜默資料損壞到立即崩潰,甚至包括一些壞人將后門下載到您的 PC 上。
因此,您的作業是確保您的程式不會越界訪問任何陣列。您的作業是確保您在任何需要它們的地方都知道陣列的大小和起始地址,并且您的作業是確保所有訪問都在這些限制范圍內。
現在,對于像示例中那樣靜態分配的陣列,您可以使用sizeof運算子獲取其大小:
size_t wordCount = sizeof(words)/sizeof(*words);
printf("this should be 9 in your example: %zu\n", wordCount);
這將獲取用于陣列的位元組數words,并將其除以陣列第一個元素中的位元組數*words。這是獲取靜態陣列元素計數的標準技巧。
但是,這僅適用words于編譯器知道其大小的陣列。一旦將其傳遞給函式,該資訊就消失了:
void buggy(char* words[]) {
printf("not what you expect: %zu\n", sizeof(words)/sizeof(*words));
}
原因是,當您將陣列傳遞給函式時,陣列會衰減為指標,而指標只是一個數字,不保留陣列的任何大小資訊。該資訊僅在陣列的型別中,并且該型別已經衰減。
uj5u.com熱心網友回復:
您可以使用以下方法獲取陣列的大小:
printf("length of the array : %d \n", sizeof(words)/8);
請參閱下面的示例。
int main()
{
char *words[] = {"The", "Quick", "Brown", "Fox", "Jumped", "Over", "The", "Lazy", "Dog"};
char ** point = &words[9];
int i;
printf("length of the array : %d \n", sizeof(words)/8);
for(i=0;i<9;i ){
printf("%s\n",words[i]);
}
for(i=0;i<9;i ){
printf("%d\n",point[i]);
}
return 0;
}
然后,您可以回圈使用陣列的大小。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/366854.html
上一篇:任務不會被破壞并填滿記憶體
