2016-12-28 33 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; 
}