警告:初始化从指针生成整数而不进行强制转换

时间:2013-11-26 07:43:15

标签: c pointers gcc

我只是编写了一个像IntegerToString一样使用递归的函数,但GCC刚刚出现

"its.c: In function ‘ITS’:
its.c:26:3: warning: initialization makes integer from pointer without a cast [enabled by default]
its.c:26:3: warning: (near initialization for ‘buffer[0]’) [enabled by default]
its.c:26:3: warning: initialization makes integer from pointer without a cast [enabled by default]
..."

我不知道如何解决它。请帮助我。

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

char *Change(char *buffer,int n)
 {
   if(n==0){
    return(buffer);
  }else{
    int left=n%10;         
    n=n/10;                
    int len=strlen(buffer);
    buffer[len-1]='\0';    
    char new_array[30]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
            NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
            NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
    printf("%s\n",new_array);
    new_array[0]=left+'0';   printf("NEW:%s\n",new_array);
    strcat(new_array,buffer); printf("TEST:%s\n",new_array);
    return(Change(new_array,n));
  }
}

char *ITS(int n)
{
  char buffer[30]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
           NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
           NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};;
    return(Change(buffer,n));
}

int main()
{
   int n=1729;
   char *buffer=(char*)malloc(30*sizeof(char));
  if(buffer==NULL)
     {
      printf("Malloc Fault!\n");
      exit(-1);
     }
   buffer=ITS(1729);
   printf("%s\n",buffer);

  return 0;
}

2 个答案:

答案 0 :(得分:2)

正如评论中指出的那样,使用和从函数返回本地存储是不安全的。更改ITS()和Change()的签名,以便从main()中获取缓冲区:

char * Change(char * srcBuffer, int n) ;
char * ITS( char * srcBuffer, int n) ;

int main()
{
  int n= 1729 ;
  char buffer[30] ;
  printf("%d = %s\n", n, ITS( buffer, n)) ;
}

如果你很聪明,那么你可以让Change返回与ITS不同的值,并用它来告诉每个级别下一个数字的位置。

如果您的ITS签名受限(请参阅注释),请在ITS中使用静态内存。它不是线程安全的,但它会起作用:

char * Change(char * srcBuffer, int n) ;
char * ITS( int n )
{
  static char buffer[30] = { 0 } ;
  return Change( buffer, n) ;
}

int main()
{
  int n= 1729 ;
  printf("%d = %s\n", n, ITS( n)) ;
}

答案 1 :(得分:0)

不要用NULL初始化字符数组(即使NULL实际上是...... 0或When was the NULL macro not 0?)。 NULL用于表示指针指向“无”。如果要使用0初始化数组,可以使用memset(C样式):

BUFFER_LEN = 30;
memset(buffer, 0, sizeof(*buffer)*BUFFER_LEN);