具有意外输出的简单C程序

时间:2018-09-30 01:47:16

标签: c printf

我正在尝试解决leetcode506。(相对等级问题)。 这是尚未完成的C代码,还有一个令人困惑的输出意外的情况。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i=0,j,nums[]={5,4,3,2,1},tmp;
    char str[21];
    char **ret=(char **)malloc(sizeof(*ret)*5);
    for(i=0;i<5;i++)     //bubble sort
    {
        for(j=5-1;j>i;j--)
        {
            if(nums[i]>nums[j])
            {
                tmp=nums[i];
                nums[i]=nums[j];
                nums[j]=tmp;
            }
        }
    }
    for(i=0;i<5;i++)
    {
        if(i<3)
        {
            if(i==0)
            *(ret+i)="Gold Medal";
            else if(i==1)
            *(ret+i)="Silver Medal";
            else
            *(ret+i)="Bronze Medal";
        }
        else
        {

            sprintf(str,"%d",nums[i]);      
            *(ret+i)=str;   
            //printf("%s ",*(ret+i));
        }
    }
    for(i=0;i<5;i++)
    printf("%s ",*(ret+i));

}

我认为输出应该是:

  

金牌
  银牌
  铜牌
  4
  5

但实际输出是:

  

金牌
  银牌
  铜牌
  5
  5

ans:

else
        {
            char *str=malloc(sizeof(char)*10);
            sprintf(str,"%d",nums[i]);      
            *(ret+i)=str;   
            //printf("%s ",*(ret+i));
        }

1 个答案:

答案 0 :(得分:3)

您在第一个循环中分配了两次strret[3]ret[4]都指向相同的内存地址。输出数组时,在第二个循环中,您将获得两次5,因为其值在上一个循环中被覆盖。

语句*(ret+i) = str;不会复制变量str的值,而只是将ret+1指向str的地址。使用str为其字节分配值时,sprintf的地址不变。