2016-12-28 106 views
-1

我有個問題,我找不出來。我寫了這個代碼洗牌數組的元素:使用const替代變量聲明的空指針

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

const char *array[]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; 

int main(int argc, char **argv) 
{ 
int i, tmp, randomize, size; 

size = sizeof(array)/sizeof(*array); 

srand(time(NULL)); 

for(i=size;i>0;i--){ 
    randomize=0+(rand()%size); 
    tmp=(int)array[i]; 
    array[i]=array[randomize]; 
    array[randomize]=(char*)tmp; 
} 

for(i=0;i<size;i++) 
    printf("%s", array[i]); 
    return 0; 
} 

當我運行程序,這是iutput:

azlngiwexbv(null)uscphqjyrodmtk 

我不明白爲什麼指針有時是零,我不明白爲什麼,以這種方式更改源代碼:

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

int main(int argc, char **argv) 
{ 
char *array[]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; 
int i, tmp, randomize, size; 

size = sizeof(array)/sizeof(*array); 

srand(time(NULL)); 

for(i=size;i>0;i--){ 
    randomize=0+(rand()%size); 
    tmp=(int)array[i]; 
    array[i]=array[randomize]; 
    array[randomize]=(char*)tmp; 
} 

for(i=0;i<size;i++) 
    printf("%s", array[i]);  
return 0; 
} 

一切工作正常。 謝謝。

+2

'tmp =(int)array [i];'...爲什麼? –

+0

要避免此警告: –

+0

警告:賦值使指針中的整數不會投射[-Wint-conversion] tmp = array [i]; ^ –

回答

3

size-1開始循環,您指出array[size](第一次循環迭代)中的數組。

for (i=size-1; i>=0; i--) 
+0

在數組之外,選擇解釋空字符輸出的nul終止字符 –

+1

@ Jean-FrançoisFabre否,根本不是。即使'數組'被終止(不是),那麼null仍然會在其範圍內。這簡直就是UB。 – Quentin

+0

pbn,您的建議有效,謝謝。但我仍然不明白爲什麼,在主函數中聲明變量char *數組,程序工作正常: - \ –

0

您應該儘可能避免鑄造,而且很少有必要這樣做。

除非您計劃使用argcargv[],請使用更簡單的表格main()int main(void)。這將刪除一些編譯器警告,並且您應該啓用這些警告;刪除全部由您的編譯器發出的警告。

你施放一個指針charint將其存儲在tmp,然後你施放tmp回到(char *)。只需聲明tmp作爲指向char開始。第一個循環從size倒數到0;這已經超出了數組範圍,但爲什麼不使用傳統的循環結構:for (i = 0; i < size; i++)?另外,你應該考慮使用size_t作爲數組索引;它是一個無符號整數類型,保證能夠保存任何數組索引,並且也是由sizeof運算符返回的類型。

此外,在您的第一個版本中,您已將array聲明爲指向const char的指針數組。您可以執行此操作,但需要臨時存儲變量tmpconst類型限定符一致。

以上是您的代碼與上述更改。沒有演員,編譯沒有警告,它的工作。

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

int main(void) 
{ 
    const char *array[] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; 

    const char *tmp; 
    size_t i, size; 
    int randomize; 

    size = sizeof(array)/sizeof(*array); 

    srand(time(NULL)); 

    for(i = 0; i < size; i++){ 
     randomize = (rand() % size); 
     tmp = array[i]; 
     array[i] = array[randomize]; 
     array[randomize] = tmp; 
    } 

    for(i = 0; i < size; i++) 
     printf("%s", array[i]); 
    putchar('\n'); 

    return 0; 
}