为什么来自被调用函数的指针不会将值返回给调用函数?

时间:2016-11-10 07:01:29

标签: c pointers

#include<stdio.h>
#include<stdlib.h>
unsigned int *bin(int);
int main(void)
{
  unsigned int n=0,*i=NULL;
  printf("Enter no:");
  scanf("%d",&n);
  i=bin(n);
  printf("Binary no: %d\n",*i);
  return 0;
}
unsigned int *bin(int n)
{
  unsigned int i=0,j=0;
  static unsigned int *result=NULL;
  result=(unsigned int*)malloc(1*sizeof(unsigned int));
  printf("Result=%p\n",result);
  j=(unsigned int)result;
  for(i=(1<<31);i>0;i=(i>>1))
  {
    if(n & i)
    {
      *result=1;
      result++;
    }
    else
    {
      *result=0;
      result++;
    }
}
  result=(unsigned int*)j;
  printf("Result=%p\n",result);
  return result;
}
Output : 
Enter no:6
Address of Result=0x2576010
Address of Result=0x2576010
Binary no: 0

该程序的目的是将十进制数转换为二进制数。主要功能是调用bin()函数将十进制转换为二进制。

代码逻辑: - 让我们取无符号整数(32位),它由0-31位组成。要打印无符号整数的二进制表示,从第31位开始,检查第31位是ON还是OFF,如果是ON则打印“1”否则打印“0”。现在检查第30位是ON还是OFF,如果是ON打印“1”,否则打印“0”,对31到0的所有位执行此操作,最后我们将得到数字的二进制表示。

我很困惑应该使用malloced多少空间来存储32位整数。如何释放分配给result的内存。请帮我解决这个问题。

3 个答案:

答案 0 :(得分:2)

考虑到数据类型1和0为char,您需要分配32字节(至少)的内存来存储对应于n中每个位的1或0。此外,我建议将int作为数据类型并分配32x4(字节)的内存。这可能是你的最终代码应该是这样的:

#include<stdio.h>
#include<stdlib.h>
unsigned int *bin(int);
int main(void)
{
  unsigned int n=0,*result =NULL;
  printf("Enter no:");
  scanf("%d",&n);
  result =bin(n);
  printf ("binary representation is: ");
  int i;
  for ( i=0;i<32;i++)
    printf("%d ",result[i]);
  free(result);
  return 0;
}

unsigned int *bin(int n)
{
  unsigned int i=0;
  static unsigned int *result=NULL;
  result=(unsigned int*)malloc(32*sizeof(unsigned int));
  printf("Result=%p\n",result);
  unsigned int* j=NULL;
  j=result;
  for(i=(1<<31);i>0;i=(i>>1))
  {
    if(n & i)
    {
      *j=1;
      j++;
    }
    else
    {
      *j=0;
      j++;
    }
}

  return result;
}

答案 1 :(得分:1)

Shubham,我真的认为你的方向错误,因为首先没有十进制或二进制整数这样的东西。我建议你使用malloc和没有static指针来解决你的问题:

/*
 * return a 32-bit long binary string from 'integer'
 *  this string is dynamically allocated (malloc)
 * return NULL in case of error (so DON'T free it in this case)
 */
char* bin(long integer)
{
 char* pChResult=malloc(33*sizeof(char));
 char* pCh;
 unsigned long i;
 if(pChResult!=NULL) {
   for(pCh=pChResult, i=1<<31; i>0; pCh++, i>>=1) {
    if(i&integer)
     *pCh='1';
    else
     *pCh='0';
    }
   *pCh='\0';
  }
 return(pChResult);
}

你的主人也会很轻松:

int main(void)
{
  unsigned int n;
  char* result;
  printf("Enter no:");
  scanf("%d",&n);
  result = bin(n);
  if(result==NULL)
   {
    fprintf(stderr, "internal error!\n");
    return(-1);
   }
  printf("binary representation is: %s\n", result);
  free(result);
  return(0);
}

答案 2 :(得分:0)

32位积分值强制使用signed longunsigned long

在功能bin中,只需在存储结果时使用*result  然后return(result);

主要使用*result以及free(result);完成结果时

为什么不简单地unsigned long bin(long);

最后,你的功能绝对没有!应该是void bin(long, char[33]);(不需要malloc)或char* bin(long);(带malloc